为什么 flatMap 不将 Stream<Stream<SomeClass>> 平铺到 SomeClass 而是平铺到 Stream<SomeClass>?

我对 flatMap 的了解:

要了解扁平化流的内容,请考虑 像 [[1,2,3],[4,5,6],[7,8,9]] 这样的结构有“两个层次”。 扁平化这意味着将其转换为“一级”结构:[ 1,3,4,6,7,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 为我平铺 Stream<Stream 并给我 City 类采取类似:.flatMap(city -> city.population) 来过滤:.filter(population > 1000) 但似乎我错了。请解释为什么 flatMap 不这样做?不是扁平化的目的吗?

lzh050925 回答:为什么 flatMap 不将 Stream<Stream<SomeClass>> 平铺到 SomeClass 而是平铺到 Stream<SomeClass>?

flatMap() 的目标不是对 AStream<Stream<A>> 项应用转换。如果您最终得到这样的类型,则很可能表明您在某处误用了 map() 操作。

flatMap() 的目标是当您有一个函数 Stream<A> 可以从单个 Stream<B> 生成 f 时,将 Stream<B> 转换为 A {1}} 元素(稍微简化一下,它是一个 Function<A,Stream<B>>)。 IE。它通过避免以嵌套流结束来“扁平化”流。

你会像这样使用它

getStreamOfA().flatMap(f) // returns Stream<B>

所以在你的例子中:

Stream<City> cityStream = countries
                .stream()
                .flatMap(country -> country.cities.stream());
本文链接:https://www.f2er.com/41929.html

大家都在问