一文弄懂java8中的map和flatMap

最近学习java8的Stream api时,发现有两个api很相似,即map和flatMap。map我们都知道是映射,那这个flatMap是什么意思呢,flat有拉平的意思,难道是拉平映射?虽说没有这样的专业说法,但是感觉上有点像那么回事,于是上网查找资料,结果一无所获,全是一些比较晦涩难懂的说法,什么一对一转换,一对多转换,或者上来弄一张不知道所以然的图,真的很让初学者懵逼啊!

在学习之前,先让大家解决一个经常遇到的数据提取问题,假设有这样一组数据,两个班级,每个班级有5个学生,每位同学都有着自己的学号、姓名、性别,现在让我们提取出两个班级所有学生的姓名,那么应该怎么做?

    static class Student {
        private String userName;
        private String userNo;
        private String userSex;
        public Student(String userName, String userNo, String userSex) {
            this.userName = userName;
            this.userNo = userNo;
            this.userSex = userSex;
        }
        public String getUserName() {
            return this.userName;
        }
    }
    private static List<List<Student>> getMaps() {
        List<List<Student>> students = new ArrayList<>();
        List<Student> class1 = new ArrayList<>();
        class1.add(new Student("1-1", "男", "小羊"));
        class1.add(new Student("1-2", "男", "小牛"));
        class1.add(new Student("1-3", "男", "小刺猬"));
        List<Student> class2 = new ArrayList<>();
        class2.add(new Student("2-1", "男", "小羊"));
        class2.add(new Student("2-2", "男", "小牛"));
        class2.add(new Student("2-3", "男", "小刺猬"));
        students.add(class1);
        students.add(class2);
        return students;
    }

java8之前

List<List<Student>> data = getMaps();
List<String> nums = new ArrayList<>();
for (List<Student> item : data) {
    for (Student student : item) {
        nums.add(student.userNo);
    }
}
System.out.println(nums);

输出结果: [小羊, 小牛, 小刺猬, 小羊, 小牛, 小刺猬]

java8 map

var result1 = data.stream().map(Collection::stream).collect(toList());
result1.forEach(System.out::println);

输出结果

java.util.stream.ReferencePipeline$3@17c68925
java.util.stream.ReferencePipeline$3@7e0ea639

java8 flatMap

var result2 = data.stream().flatMap(Collection::stream).collect(toList());
result2.forEach(System.out::println);

输出结果:[小羊, 小牛, 小刺猬, 小羊, 小牛, 小刺猬]

总结:
通过上面的演示,可以看出使用map是达不到效果的,而使用flatMap却可以,它可以将多个数组里的元素拉出来然后返回在一个数组里,可能这就是拉平的意思吧,将多维数组(即数组中嵌套数组,也可以理解为二维数组)拉平成一个数组。