如何将List <entry>转换为Map,其中value是使用流的列表?

时间:2018-06-08 14:19:07

标签: java java-stream

如何使用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"]}

1 个答案:

答案 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;})); 收集器并且它的可读性较低时,它并不理想。