flatMap几个简单的应用

知识点

返回由将给定函数应用于此流的元素的结果组成的流。
<R> Stream<R> map(Function<? super T, ? extends R> mapper);

返回一个流,该流由通过将提供的映射函数应用于每个元素而生成的映射流的内容替换此流的每个元素的结果组成。
每个映射流在其内容放入该流后closed 。 (如果映射流为null ,则使用空流代替。)
flatMap()操作的作用是对流的元素应用一对多转换,然后将结果元素展平为新的流。
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

数据准备

例子举得不是很恰当。

		list1.add(new Student("王一",17));
        list1.add(new Student("郑二",17));
        list1.add(new Student("张三",15));

        list2.add(new Student("张三",15));
        list2.add(new Student("李四",18));
        list2.add(new Student("王五",17));
        list2.add(new Student("韩六",19));

        list3.add(new Student("韩六",19));
        list3.add(new Student("田七",17));
        list3.add(new Student("赵八",14));
        list3.add(new Student("钱九",17));

        list.add(new Result("语文",88,list1));
        list.add(new Result("数学",88,list2));
        list.add(new Result("英语",88,list3));

数据处理

几个简单的应用

1,取出所有用户信息

List<List<Student>> collect = list.stream().map(Result::getStudents).collect(Collectors.toList());

在这里插入图片描述

List<Student> collect4 = list.stream().flatMap(a -> a.getStudents().stream()).collect(Collectors.toList());

在这里插入图片描述

2,取出用户姓名

List<List<String>> lists = list.stream().map(Result::getStudents)
                .map(b -> b.stream().map(Student::getName).collect(Collectors.toList())).collect(Collectors.toList());

在这里插入图片描述

List<String> collect1 = list.stream().flatMap(a -> a.getStudents().stream()).map(Student::getName).collect(Collectors.toList());

在这里插入图片描述

从这两个例子来看,可以简单的认为map是一对一的关系,flatMap既可以单一转换也可以一对多/多对多转换。

在这里插入图片描述

3,取出去重后的名

List<String> collect2 = list.stream().flatMap(a -> a.getStudents().stream()).map(Student::getName).distinct().collect(Collectors.toList());

在这里插入图片描述

4,排序后取出姓名

List<String> collect3 = list.stream().flatMap(a -> a.getStudents().stream().sorted(Comparator.comparing(Student::getAge)))
                .map(Student::getName).collect(Collectors.toList());

在这里插入图片描述

5,每科去除age小于16,只取去重后的年龄

int[] ints = list.stream().flatMap(a -> a.getStudents().stream().filter(b -> b.getAge() > 16))
                .mapToInt(Student::getAge).distinct().toArray();

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值