结果:
文章插图
4.映射(map/flatMap) 映射,可以将一个流的元素按照一定的映射规则映射到另一个流中 。分为
map
和flatMap
:map
:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 。flatMap
:接收一个函数作为参数 , 将流中的每个值都换成另一个流,然后把所有流连接成一个流 。
public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("张三", 1000, 20, "男", "北京"));personList.add(new Person("李四", 2000, 21, "男", "南京"));personList.add(new Person("王五", 3000, 20, "女", "合肥"));personList.add(new Person("赵六", 4000, 22, "男", "四川"));personList.add(new Person("孙七", 5000, 25, "女", "上海"));// 将员工工作全部增加10000元// 1、方式一:不改变原来员工集合List<Person> personListNew = personList.stream().map(person -> {Person personNew = new Person(person.getName(), 0, 0, null, null);personNew.setSalary(person.getSalary() + 10000);return personNew;}).collect(Collectors.toList());System.out.println("一次改动前:" + personList.get(0).getName() + ">>>" + personList.get(0).getSalary());System.out.println("一次改动后:" + personListNew.get(0).getName() + ">>>" + personListNew.get(0).getSalary());// 2、方式二:改变原来员工集合的方式List<Person> personListNew2 = personList.stream().map(person -> {person.setSalary(person.getSalary() + 10000);return person;}).collect(Collectors.toList());System.out.println("二次改动前:" + personList.get(0).getName() + ">>>" + personListNew.get(0).getSalary());System.out.println("二次改动后:" + personListNew2.get(0).getName() + ">>>" + personListNew.get(0).getSalary());// 将两个字符数组合并成一个新的字符数组List<String> list = Arrays.asList("Hello", "World");Stream<String> map = list.stream().map(s -> s.split("")).flatMap(Arrays::stream);map.forEach(System.out::print);System.out.println();// 给定两个数字列表 获取所有的数对List<Integer> numbers1 = Arrays.asList(1, 2, 3);List<Integer> numbers2 = Arrays.asList(3, 4);// flatMap升维度List<int[]> pairs = numbers1.stream().flatMap(x -> numbers2.stream().map(y -> new int[] { x, y })).collect(Collectors.toList());for (int[] pair : pairs) {System.out.print(Arrays.toString(pair));}}
结果:文章插图
5.归约(reduce)归约,也称缩减 , 顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作 。
public static void main(String[] args) {List<Person> personList = new ArrayList<>();personList.add(new Person("张三", 1000, 20, "男", "北京"));personList.add(new Person("李四", 2000, 21, "男", "南京"));personList.add(new Person("王五", 3000, 20, "女", "合肥"));personList.add(new Person("赵六", 4000, 22, "男", "四川"));personList.add(new Person("孙七", 5000, 25, "女", "上海"));// 求所有员工的工资之和、最高工资// 求工资之和方法1:Optional<Integer> sumSalary = personList.stream().map(Person::getSalary).reduce(Integer::sum);// 求工资之和方法2:Integer sumSalary2 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(), Integer::sum);// 求最高工资方法1:Integer maxSalary = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(), Integer::max);// 求最高工资方法2:Integer maxSalary2 = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(), (max1, max2) -> max1 > max2 ? max1 : max2);// 求最高工资方法3:Integer maxSalary3 = personList.stream().map(Person::getSalary).reduce(Integer::max).get();System.out.println("工资之和 , 方法1:" + sumSalary);System.out.println("工资之和,方法2:" + sumSalary2);System.out.println("最高工资,方法1:" + maxSalary);System.out.println("最高工资,方法2:" + maxSalary2);System.out.println("最高工资 , 方法3:" + maxSalary3);}
结果:文章插图
6.收集(collect)
collect
, 收集,可以说是内容最繁多、功能最丰富的部分了 。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合 。collect
主要依赖java.util.stream.Collectors
类内置的静态方法 。6.1归集(toList/toSet/toMap)因为流不存储数据,那么在流中的数据完成处理后,需要将流中的数据重新归集到新的集合里 。toList、toSet和toMap比较常用 , 另外还有toCollection、toConcurrentMap等复杂一些的用法 。
推荐阅读
- 达梦dba_segments指定表名查询到的大小都包含哪些数据
- Object Detection 【YOLOv5】LabVIEW+YOLOv5快速实现实时物体识别含源码
- Object Detection 手把手教你使用LabVIEW OpenCV dnn实现物体识别含源码
- 含蓄的表白的句子有哪些?14个适合表白句子
- 案例分享-https证书链不完整导致请求失败
- 含源码 手把手教你使用LabVIEW OpenCV dnn实现图像分类
- 一 CPS攻击案例——基于脉冲宽度调制PWM的无人机攻击
- 俄罗斯套娃含义-俄罗斯套娃指的是什么?
- NFC 怎么使用(nfc具体使用方法)
- 从缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析案例