[英]How can we avoid nested Collection.stream() calls?
假设我们有以下Map
Map<String, List<String>> peopleByCity = new TreeMap<>();
具有以下内容:
{ "London" : [ "Steve", "John"],
"Paris" : [ "Thierry" ],
"Sofia" : [ "Peter", "Konstantin", "Ivan"] }
与该流API的工具,对于每对类型的[City ; Person]
[City ; Person]
,我想应用一些操作,比如说打印:
London : Steve
London : John
Paris : Thierry
Sofia : Peter
Sofia : Konstantin
Sofia : Ivan
可能的(但不是很整洁)的解决方案是:
peopleByCity.entrySet()
.stream()
.forEach( entry -> {
String city = entry.getKey();
entry.getValue().
.stream() <-- the nested Collection.stream() call
.forEach(
person -> System.out.println(city + ";" + person));
});
我们如何通过创建对其他Stream / Collector功能的调用链来避免对Collection.stream()
的嵌套调用?
一种方法是“ flatMap”列表:
peopleByCity.entrySet().stream()
.flatMap(e -> e.getValue().stream().map(p -> e.getKey() + ";" + p))
.forEach(System.out::println);
另一种方法是使用两个forEach
:
peopleByCity.forEach((city, people) ->
people.forEach(person -> System.out.println(city + ";" + person)));
但最后,除非您编写自定义收集器(否则嵌套的流将在收集器中),否则我认为绕列表没有简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.