当前位置: 首页 > 知识库问答 >
问题:

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

麻阳
2023-03-14

我即将掌握新的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的简单问题!

奖励:假设导航地图


共有1个答案

杨和蔼
2023-03-14

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

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,而是在每个内部Maps中搜索max键,并获得max键的对应人员。

我可能会有一些愚蠢的拼写错误,因为我还没有真正测试过它,原则上它应该可以工作。

 类似资料: