【发布时间】:2021-10-01 11:14:34
【问题描述】:
我读到的关于 flatMap 的内容:
要了解扁平化流的含义,请考虑一个 像 [ [1,2,3],[4,5,6],[7,8,9] ] 这样的结构,它有“两个层次”。 展平这意味着将其转换为“一层”结构:[ 1,2,3,4,5,6,7,8,9]
import java.util.List;
import java.util.stream.Stream;
public class FlatMapDemo {
List<Country> countries;
void demoFlatMap(){
Stream<Stream<City>> streamStreamCity = countries
.stream()
.map(country -> country.cities.stream());
streamStreamCity.flatMap(cityStream -> /*it's not City, it's Stream<City> !!!*/);
}
}
class Country{
List<City> cities;
}
class City {
int population;
}
所以我只想计算来自所有国家的所有人口,但城市人口超过 1000 人。所以我创建了Stream<Stream<City>> 并希望flatMap flat 为我Stream<Stream 并给我City 类采取类似:.flatMap(city -> city.population) 过滤后:.filter(population > 1000) 但似乎我错了。请解释为什么 flatMap 不这样做?不就是扁平化的目的吗?
【问题讨论】:
-
不需要将flatMap拆分为单独的操作,可以在map()方法之后继续拆分。您将其从 Stream
扁平化为 Stream ,因此现在您可以添加过滤器,如 filter(county.getPopulation() > 1000) 和一个谓词,该谓词将过滤具有 > 1000 居民的城市,然后使用终端操作收集(Collectors.counting());最后将返回与上述谓词匹配的记录数。 -
我拆分它只是为了暴露变量的类型:
Stream<Stream<City>>,我的问题是:为什么flatMap没有从Stream<Stream<City>>到达City? -
所以:
int sum = streamStreamCity.flatMap(cityStream -> cityStream) .filter(city -> city.population > 1000) .mapToInt(city -> city.population) .sum();- 对吧? -
flatMap操作将流的流扁平化为单个流。如果我正确理解你想要什么,你应该做int totalPopulation = countries.stream().flatMap(country -> country.cities.stream()).mapToInt(city -> city.population).filter(population -> population > 1000).sum()。
标签: java java-8 java-stream flatmap