我有以下对象和 map :
MyObject
String name;
Long priority;
foo bar;
Map<String, List<MyObject>> anotherHashMap;
我想在另一个 map 中转换 map 。结果映射的键是输入映射的键。结果映射的值是我的对象的属性“名称”,按优先级排序。
排序 和提取名称不是问题,但我无法将其放入结果映射中。我用旧的 Java 7 方式来做,但如果可以使用流式 API 就好了。
Map<String, List<String>> result = new HashMap<>();
for (String identifier : anotherHashMap.keySet()) {
List<String> generatedList = anotherHashMap.get(identifier).stream()...;
teaserPerPage.put(identifier, generatedList);
}
有人有想法吗?我试过了,但卡住了:
anotherHashMap.entrySet().stream().collect(Collectors.asMap(..., ...));
最佳答案
Map<String, List<String>> result = anotherHashMap
.entrySet().stream() // Stream over entry set
.collect(Collectors.toMap( // Collect final result map
Map.Entry::getKey, // Key mapping is the same
e -> e.getValue().stream() // Stream over list
.sorted(Comparator.comparingLong(MyObject::getPriority)) // Sort by priority
.map(MyObject::getName) // Apply mapping to MyObject
.collect(Collectors.toList())) // Collect mapping into list
);
本质上,您流过每个条目集并将其收集到新 map 中。要计算新 map 中的值,您可以流过 List<MyOjbect>
从旧 map 中排序,并对其应用映射和收集功能。在这种情况下,我使用了 MyObject::getName
作为映射并将结果名称收集到列表中。
关于Java 8 流 : iterate over Map of Lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27448266/