Stream流中map与flatMap区别

>> 饿了么、美团外卖红包领取地址<<

map和flatMap都是对流中的每一个元素,执行入参中的函数式方法,只是在函数式方法的返回值上有区别:
map中函数式方法返回值为对象,也就是原始流中有n个元素,处理之后的流中元素个数也是n个。即使你在返回的时候返回了多个元素如数组,他也会把数组当成一个对象处理。
flatMap中函数式方法返回值为流,flat为扁平的意思,也就是说,我们可以通过flatMap改变原始流中对象的个数,flatMap会将返回的流合并成一个流,而不是当成对象处理。

通过一个简单的例子来理解:
假设有一个数组1,2,3,4,5对每个元素进行处理,当值为偶数时,则返回双个,也就是结果为:1,2,2,3,4,4,5这个时候就需要使用flatMap来处理。我们可以通过下面的示例图及代码体验一下区别:

public class Test {

    public static void main(String[] args) {

        List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);

        List<Object> res1 = nums.stream().map(e -> {
            if (e % 2 == 0) {
                return Arrays.asList(e, e);
            } else {
                return e;
            }
        }).collect(Collectors.toList());

        List<Object> res2 = nums.stream().flatMap(e -> {
            if (e % 2 == 0) {
                return Stream.of(e, e);
            } else {
                return Stream.of(e);
            }
        }).collect(Collectors.toList());

        System.out.println(res1);
        System.out.println(res2);

    }

}

执行结果:


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍

维特丝(vetes)泡沫发蜡喷雾干胶定型弹力素羊毛卷男女保湿蓬松发胶 泡沫发蜡450ml+旅行装99ml
¥34.00
维特丝(vetes)一梳黑染发剂染发梳植物潮色显白遮盖白发自然清水纯黑发焗油男女梳炫彩 自然黑LW00
¥49.00
维特丝(vetes)染发笔遮白补染快速染发天然植物一次性染发棒 一次性染发棒黑色
¥46.00
维特丝 护发精油防毛躁清香玫瑰奇焕亮发干枯烫发卷发直发头发润发护发素男女士 滋养柔顺护发精油100ml
¥36.00