1.Java 8 流
Stream 是Java 8 中处理集合的关键抽象概念,可以将元素集合看出一种流,对流进行操作,,Stram API提供了一种高效且易于使用的处理数据方式。
- stream不存储数据,而是按照特定的规则对数据进行计算,一般会输出结果。
- stream不会改变数据源,通常情况下会产生一个新的集合或一个值。
- stream具有延迟执行特性,只有调用终端操作时,中间操作才会执行。
1.代码简洁:函数编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。
2.多核友好:Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下方法。
3.Stream不存储数据
4.Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream。
5.Stream是惰性求值的(延迟执行)
2.Stream创建
1.创建 Stream
一个数据源(如: 集合、数组), 获取一个流。
2.中间操作
一个中间操作链,对数据源的数据进行处理。
3.终止操作(终端操作)
一个终止操作,执行中间操作链,并产生结果 。
2.1通过java.util.Collection.stream()方法用于集合创建流
List<String> list = new ArrayList<>();
//获取一个顺序流
Stream<String> stream = list.stream();
//获取一个并行流
Stream<String> parallelStream = list.parallelStream();
2.2使用java.util.Arrays.stream(T[] array)
int[] array = {1, 3, 5, 7, 9};
IntStream stream = Arrays.stream(array);
2.3使用Stream的静态方法:of()、iterate()、generate()
产生一个元素为给定值的流
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.forEach(System.out::println);
产生一个无限流,在第一个值基础上,调用函数产生的值
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);
3.Stream流程
1)第一步:把集合转换为流stream
2)第二步:操作stream流
stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果
获取一个数据源(source)→ 数据转换→执行操作获取想要的结果。
4.Stream的使用
(foreach/find/match)操作
List<Integer> listNum = Arrays.asList(1, 2, 3, 8, 9, 5, 7);
// 遍历输出符合条件的元素
listNum.stream().filter(x -> x > 7).forEach(System.out::println);
// 符合条件的元素匹配第一个
Optional<Integer> findFirst = listNum.stream().filter(x -> x > 7).findFirst();
// 符合条件的元素匹配任意(适用于并行流)
Optional<Integer> findAny = listNum.parallelStream().filter(x -> x > 7).findAny();
// 是否包含符合特定条件的元素
boolean anyMatch = listNum.stream().anyMatch(x -> x > 7);
System.out.println("匹配第一个值:" + findFirst.get());
System.out.println("匹配任意一个值:" + findAny.get());
System.out.println("是否存在大于6的值:" + anyMatch);
//结果
8
9
匹配第一个值:8
匹配任意一个值:9
是否存在大于6的值:true