假设我们有以下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()
的嵌套调用?
答案 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)));
但最后我认为除了编写自定义收集器之外,还有一种简单的流式传输列表的方法(但嵌套流将在收集器中)。