知识点
返回由将给定函数应用于此流的元素的结果组成的流。
<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();