Java Lambda从入门到精通十一 流的使用–映射

接下来我们就来具体看一下流都有哪些操作。

1、映射 map、flatMap

map

可以帮我们从一个流中提取一个新的流,map会被应用到每个元素上,并将其映射成一个新的元素。

map代码:

//映射
        List<Student> list = new ArrayList<>();
        String[] names = {"小明","小华","小志","小东","小李","小张","小王","小周","小吴","小郑"};
        for(int i=0; i<10; i++) {
            Student student = Student.builder()
                    .name(names[i])
                    .age(12+i/5)
                    .no(i+1)
                    .math(85d+i).build();
            list.add(student);
        }

        List<String> studentName = list.stream().map(Student::getName).collect(Collectors.toList());
        System.out.println("获取学生姓名新的列表:");
        studentName.forEach(System.out::println);

输出结果:

获取学生姓名新的列表:
小明
小华
小志
小东
小李
小张
小王
小周
小吴
小郑

重点在这里:map(Student::getName),我们通过学生流,用map提取每个学生的姓名,生成了新的流,最终通过collect(Collectors.toList()),生成了新的集合。

flatMap

使用flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。所有使用map(Arrays::stream)时生成的单个流都被合并起来,即扁平化为一个流。

代码:

//映射后返回的stream<String[]>
        List<String[]> hello_world = Arrays.asList("Hello","Lambda").stream()
                .map(x -> x.split(""))
                .collect(Collectors.toList());
        hello_world.forEach(x->{
            for(int i=0;i<x.length;i++) {
                System.out.println(x[i]);
            }
        });

        //流的扁平化,flatMap映射后返回的stream<String>
        List<String> hello_world1 = Arrays.asList("Hello Lambda").stream()
                .map(x -> x.split(""))
                .flatMap(Arrays::stream)
                .collect(Collectors.toList());
        hello_world1.forEach(System.out::println);

输出结果:

H
e
l
l
o
L
a
m
b
d
a
===============================
H
e
l
o
 
L
a
m
b
d

我们上面的两端代码,都是想将字符数组”Hello”,”Lambda”按字符拆分后,去重,但是第一个并不是我们想要的效果,使用map处理后,返回的stream,最终distinct相当于是对两个字符串数组进行去重,所以不能排除重复的字符;第二个在执行了map函数后,又执行了flatMap,将字符数组合并到了一起,将所有内容都装到了一个数组中,这时就可以对字符进行去重了,核心方法就是这里:flatMap(Arrays::stream)。