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

时间:2014-11-20 14:38:50

标签: java lambda java-8

假设我们有以下Map

Map<String, List<String>> peopleByCity = new TreeMap<>();

具有以下内容:

{ "London" : [ "Steve", "John"],
  "Paris"  : [ "Thierry" ],
  "Sofia"  : [ "Peter", "Konstantin", "Ivan"] }

使用Stream API的工具,对于[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()的嵌套调用?

1 个答案:

答案 0 :(得分:4)

一种方法是“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)));

但最后我认为除了编写自定义收集器之外,还有一种简单的流式传输列表的方法(但嵌套流将在收集器中)。