含具体案例 Java8新特性之Stream流

一、概述??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.8116932592396652stream和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);}结果:

含具体案例 Java8新特性之Stream流

文章插图
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);}结果:
含具体案例 Java8新特性之Stream流

文章插图
3.聚合(max/min/count) maxmincount这些大家都不陌生,在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);}

推荐阅读