Java 8使用修改的值重新映射

Java 8使用修改的值重新映射,java,collections,lambda,java-8,java-stream,Java,Collections,Lambda,Java 8,Java Stream,我即将掌握新的Java8流和lambda选项,但仍有一些微妙之处我还没有完全理解 假设我有一张地图,上面的键是人名。每个名字的值都是年龄和Person实例的映射。进一步假设不存在多个具有相同姓名和年龄的人 Map<String, NavigableMap<Long, Person>> names2PeopleAges = new HashMap<String, NavigableMap<Long, Person>>(); 问题:我能用一个Java

我即将掌握新的Java8流和lambda选项,但仍有一些微妙之处我还没有完全理解

假设我有一张地图,上面的键是人名。每个名字的值都是年龄和
Person
实例的映射。进一步假设不存在多个具有相同姓名和年龄的人

Map<String, NavigableMap<Long, Person>> names2PeopleAges = new HashMap<String, NavigableMap<Long, Person>>();
问题:我能用一个Java 8流/collect/map/flant/etc.操作替换上面的最后一位代码以产生相同的结果吗?在伪代码中,我的第一个倾向是:

Map<String, Person> oldestPeopleByName = names2PeopleAges.forEachEntry().mapValue(value->value.lastEntry().getValue());
Map oldestPeopleByName=names2PeopleAges.forEachEntry().mapValue(value->value.lastEntry().getValue());
这个问题很简单,没有任何技巧或奇怪之处——只是一个如何充分利用Java8的简单问题


奖励:假设上面的
NavigableMap
仅仅是一个
地图。既然
NavigableMap.lastEntry()
不可用,您可以扩展第一个答案,以便它收集年龄值最高的人吗?

您可以创建一个条目流并将其收集到地图:

Map<String, Person> oldestPeopleByName = 
    names2PeopleAges.entrySet()
                    .stream()
                    .collect (Collectors.toMap(e->e.getKey(),
                                               e->e.getValue().lastEntry().getValue())
                             );
在这里,我们不依赖于
lastEntry
,而是在每个内部
Map
s中搜索
max
键,并获得max键的对应人员


我可能有一些愚蠢的打字错误,因为我还没有实际测试过,原则上它应该可以工作。

啊,看起来不错!我是如此接近。。。我只是还没有弄清楚收集器的
Collectors.toMap(…)
部分。哦,我在第二个例子中看到了你在做什么,获取最大值,然后将其反馈到查找中。美好的我的编译器不喜欢
.collect(e->Collectors…
部分,说它需要一个函数接口。我认为您需要将变量
e
放入
收集器.toMap(…)
,如下所示:
.collector(Collectors.toMap(e->e.getKey(),e->e.getValue().lastEntry().getValue())
@GarretWilson编辑了答案。@boris,谢谢你纠正了打字错误。但对于“不存在”和“不存在”,我认为“不止一个”是复数,这意味着语法上的“不存在”更正确。
Map<String, Person> oldestPeopleByName = 
    names2PeopleAges.entrySet()
                    .stream()
                    .collect (Collectors.toMap(e->e.getKey(),
                                               e->e.getValue().lastEntry().getValue())
                             );
Map<String, Person> oldestPeopleByName = 
    names2PeopleAges.entrySet()
                    .stream()
                    .collect (Collectors.toMap(e->e.getKey(),
                                               e->e.getValue().get(e.getValue().keySet().stream().max(Long::compareTo)))
                             );