知方号

知方号

Java stream 进阶版

1、Stream 概述

Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。

Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素可以通过 Stream API 进行各种操作,而不需要直接修改原始数据源。

Stream API 提供了三种主要的方法:

获取 Stream 流:通过创建一条流水线,并将数据放到流水线上准备进行操作。 中间方法:这些方法可以在流水线上进行操作,每次操作完毕之后,还可以继续进行其他操作。这种操作不会改变原始数据,而是返回一个新的流。 终结方法:一个 Stream 流只能有一个终结方法,它是流水线上的最后一个操作。这个方法将返回一个新的集合或值。

此外,Stream API 还具有延迟执行特性。这意味着,只有当我们调用终端操作时,中间操作才会执行。这种特性使得 Stream API 在处理大量数据时非常高效。

总的来说,Java Stream API 提供了一种灵活且高效的方式来处理集合和数组,它可以让我们更加专注于数据的操作,而不需要关心底层的实现细节。

2、Stream 的创建

 Stream可以通过集合数组创建。

1、通过 java.util.Collection.stream() 方法用集合创建流

List list = Arrays.asList("a", "b", "c");// 创建一个顺序流Stream stream = list.stream();// 创建一个并行流Stream parallelStream = list.parallelStream();

2、使用java.util.Arrays.stream(T[] array)方法用数组创建流

int[] array={1,3,5,6,8};IntStream stream = Arrays.stream(array);

3、使用Stream的静态方法:of()、iterate()、generate()

Stream stream = Stream.of(1, 2, 3, 4, 5, 6);Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);stream2.forEach(System.out::println);Stream stream3 = Stream.generate(Math::random).limit(3);stream3.forEach(System.out::println);

输出结果:

0 3 6 9 0.6796156909271994 0.1914314208854283 0.8116932592396652

stream和parallelStream的简单区分: stream是顺序流,由主线程按顺序对流执行操作,而parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:

如果流中的数据量足够大,并行流可以加快处速度。

除了直接创建并行流,还可以通过parallel()把顺序流转换成并行流:

Optional findFirst = list.stream() .parallel() .filter(x->x>6) .findFirst(); 3 Stream的使用 

在使用stream之前,先理解一个概念:Optional 。

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 更详细说明请见:菜鸟教程Java 8 Optional类

3.1 遍历/匹配(foreach/find/match)

Stream也是支持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配非常简单。

public class StreamTest {public static void main(String[] args) { List list = Arrays.asList(7, 6, 9, 3, 8, 2, 1); // 遍历输出符合条件的元素 list.stream().filter(x -> x > 6).forEach(System.out::println); // 匹配第一个 Optional findFirst = list.stream().filter(x -> x > 6).findFirst(); // 匹配任意(适用于并行流) Optional findAny = list.parallelStream().filter(x -> x > 6).findAny(); // 是否包含符合特定条件的元素 boolean anyMatch = list.stream().anyMatch(x -> x < 6); System.out.println("匹配第一个值:" + findFirst.get()); System.out.println("匹配任意一个值:" + findAny.get()); System.out.println("是否存在大于6的值:" + anyMatch); }}

预期结果:

 7 9 8 匹配第一个值:7 匹配任意一个值:8 是否存在大于6的值:true

3.2 筛选(filter)

筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。

案例一:筛选出Integer集合中大于7的元素,并打印出来

public class StreamTest {public static void main(String[] args) {List list = Arrays.asList(6, 7, 3, 8, 1, 2, 9);Stream stream = list.stream();stream.filter(x -> x > 7).forEach(System.out::println);}}

预期结果:

8 9

案例二: 筛选员工中工资高于8000的人,并形成新的集合。 形成新集合依赖collect(收集),后文有详细介绍。

public class StreamTest {public static void main(String[] args) {List personList = new ArrayList

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。