如何使用Java8中的流将List<Entry>
转换为Map<Entry::getKey, List<Entry::getValue>>
?
我无法为Collectors.toMap()提供一个好的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"]}
。
发布于 2018-06-08 14:21:08
您可以通过使用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;}));
但是,当您可以使用groupingBy
收集器时,它并不理想,而且它的可读性也较低。
https://stackoverflow.com/questions/50762681
复制相似问题