Java流将地图类属性列表转换为扁平化地图

Ter*_*nce 3 java java-stream

我们如何通过使用Java流以最佳方式将List <Foo>转向Map <propertyA,List <propertyB >>。

当心:propertyA不是唯一的

//pseudo-code
class Foo
    propertyA //not unique
    List<propertyB>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有以下内容:

fooList.stream()
       .collect(Collectors.groupingBy(Foo::propertyA, 
                    Collectors.mapping(Foo::propertyB, Collectors.toList())))
Run Code Online (Sandbox Code Playgroud)

导致Map<propretyA, List<List<propretyB>>>的价值尚未被压平。

Fed*_*ner 5

您可以使用Java 9+ Collectors.flatMapping

Map<propretyA, List<propretyB>> result = fooList.stream()
       .collect(Collectors.groupingBy(Foo::propertyA, 
                Collectors.flatMapping(foo -> foo.propertyB().stream(), 
                                       Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

另一种方法(Java8 +)是通过Collectors.toMap此答案中使用as 。

Java8 +的另一种方法是不使用流,而使用Map.computeIfAbsent

Map<propretyA, List<propretyB>> result = new LinkedHashMap<>();
fooList.forEach(foo -> result.computeIfAbsent(foo.propertyA(), k -> new ArrayList<>())
                             .addAll(foo.propertyB()));
Run Code Online (Sandbox Code Playgroud)

  • …如果不是Java 9,则[flatMapping]的反向端口位于[此答案]的末尾(/sf/answers/2739173461/) (3认同)