繁体   English   中英

如何避免嵌套的Collection.stream()调用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM