我有以下对象和地图:
MyObject
String name;
Long priority;
foo bar;
Map<String, List<MyObject>> anotherHashMap;
我想在另一张地图中转换地图。结果映射的键是输入映射的键。结果映射的值是My对象的Property“name”,按优先级排序。
排序并提取名称不是问题,但我无法将其放入结果图中。我使用旧的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(..., ...));
答案 0 :(得分:11)
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
);
基本上,您在每个条目集上流式传输并将其收集到新地图中。要计算新地图中的值,您可以从旧地图流式传输List<MyOjbect>
,对其进行排序,并应用映射和收集功能。在这种情况下,我使用MyObject::getName
作为映射,并将结果名称收集到列表中。
答案 1 :(得分:2)
Map<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream()
.sorted(comparing(MyObject::getPriority))
.map(MyObject::getName)
.collect(Collectors.toList())));
类似于Mike Kobit的答案,但排序应用于正确的位置(即值已排序,而不是映射条目),更简洁的静态方法Comparator.comparing
用于获取Comparator进行排序。
答案 2 :(得分:1)
为了生成另一张地图,我们可以使用以下内容:
HashMap<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(elem -> elem.getKey(), elem -> elem.getValue() // can further process it);
上面我再次重新创建地图,但您可以根据需要处理密钥或值。