含具体案例 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.筛选(filter) 筛选 , 是按照一定的规则校验流中的元素 , 将符合条件的元素提取到新的流中的操作 。

经验总结扩展阅读