用flatMap解析复杂对象的数据

.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”}]

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值