我们如何通过使用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>>>的价值尚未被压平。
您可以使用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)
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |