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

注意:propertyA不是唯一的

//pseudo-code
class Foo
    propertyA //not unique
    List<propertyB>

到目前为止,我有以下内容:
fooList.stream()
       .collect(Collectors.groupingBy(Foo::propertyA,
                    Collectors.mapping(Foo::propertyB, Collectors.toList())))

结果是Map<propretyA, List<List<propretyB>>>,尚未为其值展平。

最佳答案

您可以使用Java 9+ Collectors.flatMapping :

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

另一种方法(Java8 +)是通过使用this answer Collectors.toMap 中一样。

Java8 +的另一种方法是不使用流,而是使用ojit_a:
Map<propretyA, List<propretyB>> result = new LinkedHashMap<>();
fooList.forEach(foo -> result.computeIfAbsent(foo.propertyA(), k -> new ArrayList<>())
                             .addAll(foo.propertyB()));

关于java - Java流将 map 类属性列表转换为扁平化 map ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55149854/

10-09 01:38