.map:元素一对一转换,对Stream中的所有元素进行处理,返回原元素处理后的结果;
.flatMap:对Stream中的所有元素进行操作,每个元素也是一个流,然后将所有的流合并成一个Stream并返回。
如果想把复杂的数据结构转化成简单的集合,可以尝试用.flatMap。比如把嵌套集合,转换成一个list结构的数据:List<Map<String, List<Student>>> 转换成List<Student>
:
示例:
构建数据
private static List<Map<String, List<Student>>> getAllStudents() {
//一班学生:两个List<Student>,分别代表男生和女生
Map<String, List<Student>> classMap = new HashMap<>();
List<Student> boys = new ArrayList<>();
List<Student> grils = new ArrayList<>();
boys.add(new Student("1-1", "男", "小羊"));
boys.add(new Student("1-2", "男", "小牛"));
boys.add(new Student("1-3", "男", "小刺猬"));
grils.add(new Student("1-4", "女", "小花"));
grils.add(new Student("1-5", "女", "小草"));
grils.add(new Student("1-6", "女", "小蜻蜓"));
classMap.put("男生", boys);
classMap.put("女生", grils);
//二班学生:两个List<Student>,分别代表男生和女生
Map<String, List<Student>> classMap2 = new HashMap<>();
List<Student> boys2 = new ArrayList<>();
List<Student> grils2 = new ArrayList<>();
boys2.add(new Student("2-1", "男", "小羊"));
boys2.add(new Student("2-2", "男", "小牛"));
boys2.add(new Student("2-3", "男", "小刺猬"));
grils2.add(new Student("2-4", "女", "小花"));
grils2.add(new Student("2-5", "女", "小草"));
grils2.add(new Student("2-6", "女", "小蜻蜓"));
classMap2.put("男生", boys2);
classMap2.put("女生", grils2);
//把班级放进年级的集合
List<Map<String, List<Student>>> gradeStudents = new ArrayList<>();
gradeStudents.add(classMap);
gradeStudents.add(classMap2);
System.out.println("打印数据:");
System.out.println(JSON.toJSON(students));
return gradeStudents;
}
操作数据:
List<Map<String, List<Student>>> students = getAllStudents();
//.map获取两个班级所有的男生的集合
List<List<Student>> nestboys = students.stream()
.map(classMap -> classMap.get("男生"))
.collect(Collectors.toList());
System.out.println(".map获取两个班级所有的男生的集合:");
System.out.println("数据结构:List<List<Student>>");
System.out.println(JSON.toJSON(nestboys));
//.flatMap获取两个班级所有的男生的集合
List<Student> boys = students.stream()
.flatMap(classMap -> classMap.get("男生").stream())
.collect(Collectors.toList());
System.out.println(".flatMap获取两个班级所有的男生的集合:");
System.out.println("数据结构:List<Student>");
System.out.println(JSON.toJSON(boys));
打印的结果如下:
打印数据:
[
{“男生”:[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“1-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“1-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“1-3”}],
“女生”:[{“stu_sex”:“女”,“stu_name”:“小花”,“class_no”:“1-4”},{“stu_sex”:“女”,“stu_name”:“小草”,“class_no”:“1-5”},{“stu_sex”:“女”,“stu_name”:“小蜻蜓”,“class_no”:“1-6”}]
},
{“男生”:[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“2-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“2-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“2-3”}],
“女生”:[{“stu_sex”:“女”,“stu_name”:“小花”,“class_no”:“2-4”},{“stu_sex”:“女”,“stu_name”:“小草”,“class_no”:“2-5”},{“stu_sex”:“女”,“stu_name”:“小蜻蜓”,“class_no”:“2-6”}]
}
].map获取两个班级所有的男生的集合:
数据结构:List<List<`Student>>
[
[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“1-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“1-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“1-3”}],
[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“2-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“2-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“2-3”}]
].flatMap获取两个班级所有的男生的集合:
数据结构:List<`Student>
[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“1-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“1-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“1-3”},{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“2-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“2-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“2-3”}]//.map与.flatMap结合使用
//取出年级中每个班男生和女生的并集 返回List<List<Student>>
List<List<Student>> classStudents = students.stream()
.map(classMap -> classMap.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList()))
.collect(Collectors.toList());
System.out.println("每个班男生和女生的并集:");
System.out.println(JSON.toJSON(classStudents));每个班男生和女生的并集:
数据结构:List<List<`Student>>
[
[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“1-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“1-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“1-3”},{“stu_sex”:“女”,“stu_name”:“小花”,“class_no”:“1-4”},{“stu_sex”:“女”,“stu_name”:“小草”,“class_no”:“1-5”},{“stu_sex”:“女”,“stu_name”:“小蜻蜓”,“class_no”:“1-6”}],
[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“2-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“2-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“2-3”},{“stu_sex”:“女”,“stu_name”:“小花”,“class_no”:“2-4”},{“stu_sex”:“女”,“stu_name”:“小草”,“class_no”:“2-5”},{“stu_sex”:“女”,“stu_name”:“小蜻蜓”,“class_no”:“2-6”}]
]//所有学生
List<Student> allStudents = students.stream()
.map(classMap -> classMap.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toList()))
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println("所有的学生:");
System.out.println("数据结构:List<Student>");
System.out.println(JSON.toJSON(allStudents));所有的学生:
数据结构:List<`Student>
[{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“1-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“1-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“1-3”},{“stu_sex”:“女”,“stu_name”:“小花”,“class_no”:“1-4”},{“stu_sex”:“女”,“stu_name”:“小草”,“class_no”:“1-5”},{“stu_sex”:“女”,“stu_name”:“小蜻蜓”,“class_no”:“1-6”},{“stu_sex”:“男”,“stu_name”:“小羊”,“class_no”:“2-1”},{“stu_sex”:“男”,“stu_name”:“小牛”,“class_no”:“2-2”},{“stu_sex”:“男”,“stu_name”:“小刺猬”,“class_no”:“2-3”},{“stu_sex”:“女”,“stu_name”:“小花”,“class_no”:“2-4”},{“stu_sex”:“女”,“stu_name”:“小草”,“class_no”:“2-5”},{“stu_sex”:“女”,“stu_name”:“小蜻蜓”,“class_no”:“2-6”}]