Collections 转换列表<;列表<;对象>&燃气轮机;映射<;对象、列表<;对象>&燃气轮机;爪哇8

Collections 转换列表<;列表<;对象>&燃气轮机;映射<;对象、列表<;对象>&燃气轮机;爪哇8,collections,java-8,java-stream,Collections,Java 8,Java Stream,我有一个目标 class Wrapper{ private SomeObject someObject; private String value; } class SomeObject{ private String id; } 我有一个返回List的函数,我想把它转换成Map 目前,我正在使用循环和比较来实现这一点。有没有办法通过Java8流实现这一点 wrappers.stream() .flatMap(w -> w.stream())

我有一个目标

class Wrapper{ 
   private SomeObject someObject;
   private String value;
}

class SomeObject{
  private String id;
}
我有一个返回
List
的函数,我想把它转换成
Map

目前,我正在使用循环和比较来实现这一点。有没有办法通过Java8流实现这一点

wrappers.stream()
            .flatMap(w -> w.stream()) //stream of wrapper
            .collect(Collectors.toMap(<not sure which mapping fucntion to use here>))
wrappers.stream()
.flatMap(w->w.stream())//包装器的流
.collect(收集器.toMap())

您可以使用
groupingBy
收集器和
flatMap
操作符来完成此操作。这是它的样子

Map<SomeObject, List<Wrapper>> map = l.stream().flatMap(List::stream)
    .collect(Collectors.groupingBy(Wrapper::getSomeObject));
Map Map=l.stream().flatMap(List::stream)
.collect(收集器.groupingBy(包装器::getSomeObject));
然而,迭代版本的可读性要比流快得多

Map<SomeObject, List<Wrapper>> m = new HashMap<>();
for (List<Wrapper> wrappers : l)
    for (Wrapper w : wrappers)
        m.computeIfAbsent(w.someObject, unused -> new ArrayList<Wrapper>()).add(w);
Map m=newhashmap();
对于(列表包装器:l)
用于(包装器w:包装器)
m、 computeIfAbsent(w.someObject,未使用->新建ArrayList()).add(w);