如何使用Java 8中的流将List<Entry>
转换为Map<Entry::getKey, List<Entry::getValue>>
?
我无法想出一个好的KeySelector for Collectors.toMap():
List<Entry<Integer, String>> list = Arrays.asList(Entry.newEntry(1, "a"), Entry.newEntry(2, "b"), Entry.newEntry(1, "c"));
Map<Integer, List<String>> map = list.stream().collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
我想要的是:{'1': ["a", "c"], '2': ["b"]}
。
答案 0 :(得分:9)
您可以使用items/:id
收集器和groupingBy
作为下游收集器来执行此操作:
mapping
需要导入:
myList.stream()
.collect(groupingBy(e -> e.getKey(), mapping(e -> e.getValue(), toList())));
您可以使用import static java.util.stream.Collectors.*;
收集器实际获得相同的结果:
toMap
但是当你可以使用 myList.stream()
.collect(toMap(e -> e.getKey(),
v -> new ArrayList<>(Collections.singletonList(v.getValue())),
(left, right) -> {left.addAll(right); return left;}));
收集器并且它的可读性较低时,它并不理想。