我即将掌握新的Java8流和lambda选项,但仍有一些微妙之处我还没有完全理解。
假设我有一张地图,上面的键是人名。每个名字的值都是年龄和Person
实例的映射。进一步假设不存在多个具有相同姓名和年龄的人。
Map<String, NavigableMap<Long, Person>> names2PeopleAges = new HashMap<String, NavigableMap<Long, Person>>();
在填充该地图(其他地方)后,我想为每个名字生成另一张最年长者的地图。我想得到一张地图
利用
NavigableMap
对其键进行排序的事实,我可以这样做:
Map<String, Person> oldestPeopleByName = new HashMap<String, Person>();
names2PeopleAges.forEach((name, peopleAges) -> {
oldestPeopleByName.put(name, peopleAges.lastEntry().getValue());
});
问题:我能用一个Java8流/收集/映射/展平/等操作替换上面的最后一位代码以产生相同的结果吗?在伪代码中,我的第一个倾向是:
Map<String, Person> oldestPeopleByName = names2PeopleAges.forEachEntry().mapValue(value->value.lastEntry().getValue());
这个问题很简单,没有任何技巧或奇怪之处——只是一个如何充分利用Java 8的简单问题!
奖励:假设
导航地图
您可以创建条目流并将其收集到地图:
Map<String, Person> oldestPeopleByName =
names2PeopleAges.entrySet()
.stream()
.collect (Collectors.toMap(e->e.getKey(),
e->e.getValue().lastEntry().getValue())
);
现在,没有lastEntry
:
Map<String, Person> oldestPeopleByName =
names2PeopleAges.entrySet()
.stream()
.collect (Collectors.toMap(e->e.getKey(),
e->e.getValue().get(e.getValue().keySet().stream().max(Long::compareTo)))
);
在这里,我们不依赖于lastEntry
,而是在每个内部Map
s中搜索max
键,并获得max键的对应人员。
我可能会有一些愚蠢的拼写错误,因为我还没有真正测试过它,原则上它应该可以工作。
ArrayList中有一个对象列表,我希望将修改为其复数名。 参考示例: 我们有什么方法可以使用Java8流实现相同的行为吗?
我想创建一个
按照第二个链接中包含的示例,我已经测试了: 但我没有实现使用。
假设我有一个Foo对象列表。Foo上有一个属性,我必须使用它从数据源中获取Bar对象。然后我必须将每个bar对象映射回我得到bar的原始Foo对象。 我的尝试如下:
问题内容: 我有一本字典,看起来像这样: 我想将其应用于类似于以下内容的数据框的列: 我怎样才能最好地做到这一点?出于某种原因,与此相关的谷歌搜索术语仅向我显示了有关如何根据字典创建列的链接,反之亦然 问题答案: 你可以使用。例如: 或直接在上,即。
我知道如何变换