簡體   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