一、概述??Stream 流是 Java 8 新提供给开发者的一组操作集合的 API,将要处理的元素集合看作一种流,流在管道中传输, 并且可以在管道的节点上进行处理,比如筛选、排序、聚合等 。元素流在管道中经过中间操作(intermediate operation)的处理 , 最后由终端操作 (terminal operation) 得到前面处理的结果 。Stream 流可以极大的提高开发效率,也可以使用它写出更加简洁明了的代码 。我自从接触过 Stream 流之后,可以说对它爱不释手 。
二、Stream的创建Stream可以通过集合数组创建 。
1、通过 java.util.Collection.stream() 方法用集合创建流
List<String> list = Arrays.asList("a", "b", "c");// 创建一个顺序流Stream<String> stream = list.stream();// 创建一个并行流Stream<String> parallelStream = list.parallelStream();
2、使用java.util.Arrays.stream(T[] array)
方法用数组创建流
int[] array={1,3,5,7,9};IntStream stream = Arrays.stream(array);
3、使用Stream
的静态方法:of()、iterate()、generate()
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);stream2.forEach(System.out::println);Stream<Double> stream3 = Stream.generate(Math::random).limit(3);stream3.forEach(System.out::println);
输出结果:
0 3 6 90.67961569092719940.19143142088542830.8116932592396652
stream和parallelStream的简单区分:
stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求 。如果流中的数据量足够大,并行流可以加快处速度 。除了直接创建并行流,还可以通过parallel()把顺序流转换成并行流:
Optional<Integer> findFirst = list.stream().parallel().filter(x->x>6).findFirst();
三、Stream的使用(具体案例)案例中用到的员工类:/** * @description: 员工 * @author: admin */@Datapublic class Person {/*** 姓名*/private String name;/*** 薪资*/private Integer salary;/*** 年龄*/private Integer age;/*** 性别*/private String sex;/*** 地区*/private String area;public Person(String name, Integer salary, Integer age, String sex, String area) {this.name = name;this.salary = salary;this.age = age;this.sex = sex;this.area = area;}}
1.遍历/匹配(foreach/find/match)Stream
也是支持类似集合的遍历和匹配元素的,只是Stream
中的元素是以Optional
类型存在的 。Stream
的遍历、匹配非常的简单 。
public static void main(String[] args) {List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);// 遍历输出符合条件的元素List<Integer> collect = list.stream().filter(x -> x > 6).collect(Collectors.toList());// 匹配第一个Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();// 匹配任意(适用于并行流)Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();// 是否包含符合特定条件的元素boolean anyMatch = list.stream().anyMatch(x -> x > 6);System.out.println("大于6的值:" + collect);System.out.println("匹配第一个值:" + findFirst.get());System.out.println("匹配任意一个值:" + findAny.get());System.out.println("是否存在大于6的值:" + anyMatch);}
结果:
文章插图
2.筛?。╢ilter) 筛?。前凑找欢ǖ墓嬖蛐Q榱髦械脑?nbsp;, 将符合条件的元素提取到新的流中的操作 。
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, "女", "上海"));// 筛选出工作高于3000的员工List<String> list = personList.stream().filter(p -> p.getSalary() > 3000).map(Person::getName).collect(Collectors.toList());System.out.println("薪资高于3000元的员工:" + list);}
结果:文章插图
3.聚合(max/min/count)
max
、min
、count
这些大家都不陌生,在mysql中我们常用它们进行数据运算和统计 。Java stream中也引入了这些概念和用法,极大地方便了我们对集合、数组的数据统计工作 。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, "女", "上海"));// 获取工资最高的员工Optional<Person> max = personList.stream().max(Comparator.comparingInt(Person::getSalary));System.out.println("员工工资最大值:" + max.get().getSalary());// 计算工资大于2000的有多少人long count = personList.stream().filter(p -> p.getSalary() > 2000).count();System.out.println("工资大于2000元的人数:" + count);// 计算所有员工工资总和int sum = personList.stream().mapToInt(Person::getSalary).sum();System.out.println("所有员工工资总和:" + sum);}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 达梦dba_segments指定表名查询到的大小都包含哪些数据
- Object Detection 【YOLOv5】LabVIEW+YOLOv5快速实现实时物体识别含源码
- Object Detection 手把手教你使用LabVIEW OpenCV dnn实现物体识别含源码
- 含蓄的表白的句子有哪些?14个适合表白句子
- 案例分享-https证书链不完整导致请求失败
- 含源码 手把手教你使用LabVIEW OpenCV dnn实现图像分类
- 一 CPS攻击案例——基于脉冲宽度调制PWM的无人机攻击
- 俄罗斯套娃含义-俄罗斯套娃指的是什么?
- NFC 怎么使用(nfc具体使用方法)
- 从缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析案例