最近学习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却可以,它可以将多个数组里的元素拉出来然后返回在一个数组里,可能这就是拉平的意思吧,将多维数组(即数组中嵌套数组,也可以理解为二维数组)拉平成一个数组。