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

Ale*_*kov 5 java java-stream

如何在Java 8中将a转换List<Entry>Map<Entry::getKey, List<Entry::getValue>>使用流?

我无法为Collectors.toMap()提供一个好的KeySelector:

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()));
Run Code Online (Sandbox Code Playgroud)

我想得到的:{'1': ["a", "c"], '2': ["b"]}.

Ous*_* D. 10

您可以使用groupingBy收集器和mapping下游收集器来执行此操作:

myList.stream()
       .collect(groupingBy(e -> e.getKey(), mapping(e -> e.getValue(), toList())));
Run Code Online (Sandbox Code Playgroud)

需要进口:

import static java.util.stream.Collectors.*;
Run Code Online (Sandbox Code Playgroud)

实际上,您可以使用toMap收集器完成相同的结果:

 myList.stream()
       .collect(toMap(e -> e.getKey(), 
                 v -> new ArrayList<>(Collections.singletonList(v.getValue())),
              (left, right) -> {left.addAll(right); return left;}));
Run Code Online (Sandbox Code Playgroud)

但是当你可以使用groupingBy收藏家并且它的可读性较低时,它并不理想.

  • IDEA失去了`e`的类型,它说它只是一个'对象'.实际上是以某种方式重新输入来修复它,谢谢. (2认同)