flatMap相较于map,可以扁平化的操作各个元素中的子集合
比如类型A中有一个集合属性b,使用map拿到的是b集合的stream,而使用flatMap则可以直接拿到所有b集合中的元素的stream
举例
我们有一个地址类Address,其属性有省份名province和城市集合cityList
class Address{
private String province; // 省份名
private List<String> cityList; // 城市集合
public Address(String province, List<String> cityList) {
this.province = province;
this.cityList = cityList;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public List<String> getCityList() {
return cityList;
}
public void setCityList(List<String> cityList) {
this.cityList = cityList;
}
}
现在思考:如何用stream将若干个Address中的所有city输出
实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* MapAndFlatMap class
*
* @author
* @date 2022/4/18 16:26
*/
public class MapAndFlatMap {
public static void main(String[] args) {
List<Address> addressList = new ArrayList<>();
List<String> zhejiangCity = new ArrayList<>();
zhejiangCity.addAll(Arrays.asList("杭州","宁波"));
List<String> jiangsuCity = new ArrayList<>();
jiangsuCity.addAll(Arrays.asList("苏州","南京"));
List<String> fujianCity = new ArrayList<>();
fujianCity.addAll(Arrays.asList("福州","厦门"));
Address zhejiang = new Address("浙江", zhejiangCity);
Address jiangsu = new Address("江苏", jiangsuCity);
Address fujian = new Address("福建", fujianCity);
addressList.add(zhejiang);
addressList.add(jiangsu);
addressList.add(fujian);
// 不使用map、flatMap
System.out.println("------------不使用map、flatMap------------");
addressList.stream().forEach(x->x.getCityList().forEach(city-> System.out.print(city)));
System.out.println();
// 使用map
System.out.println("------------使用map------------");
addressList.stream().map(x->x.getCityList()).forEach(cityList-> System.out.println(cityList));
addressList.stream().map(x->x.getCityList()).forEach(cityList-> cityList.forEach(city-> System.out.print(city)));
System.out.println();
// 使用flatMap
System.out.println("------------使用flatMap------------");
addressList.stream().flatMap(x->x.getCityList().stream()).forEach(city-> System.out.print(city));
}
}
输出结果
可以看到map返回了将cityList作为元素的stream流
而flatMap则是直接返回了将cityList中的city作为元素的stream流
什么是扁平化?
flatMap会将元素的子集合的元素全部拿出来(不管各个元素来自于哪个父亲)做统一处理(本例操作是输出),这就是扁平化