Java Stream的map()和flatMap的区别

By | 2023年1月17日

前言

这次主要记录和分析下mapflatMap的区别

Map

作用是把Stream的元素通过Function回调函数进行转换处理后返回一个新的Stream
下面是接口的声明

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

flatMap

作用是将一个多维数组通过Function回调函数进行转换处理并拍平后返回一个新的Stream
其中Function处理完是一个Stream
也就是说吗,flatMap相当于map + flattening
下面是接口的声明

    <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

举例说明

Map

List<String> list = Arrays.asList("item1", "item2", "item3", "item4");

Stream<String> map = list.stream().map(e -> {
    return e + "-added";
});

System.err.println(map.collect(Collectors.toList()));
//[item1-added, item2-added, item3-added, item4-added]

faltMap

List<String> list1 = Arrays.asList("item11", "item12", "item13", "item14");
List<String> list2 = Arrays.asList("item21", "item22", "item23", "item24");
List<String> list3 = Arrays.asList("item31", "item32", "item33", "item34");

List<List<String>> listOfLists = Arrays.asList(list1, list2, list3);

List<String> listOfAllIntegers = listOfLists.stream()
                            .flatMap(x -> x.stream().map((e->{
                                return e + "-added";
                            })))
                           .collect(Collectors.toList());
System.out.println(listOfAllIntegers);
// [item11-added, item12-added, item13-added, item14-added, item21-added, item22-added, item23-added, item24-added, item31-added, item32-added, item33-added, item34-added]

综述

Map 擅长用来处理一对一的Stream流;而 flatMap则擅长处理多对一的Stream