Java Stream API详解与实例

需积分: 5 0 下载量 126 浏览量 更新于2024-08-04 收藏 54KB MD 举报
"本文介绍了Java中的Stream API的基本使用方法和特性,包括如何从数组和集合创建Stream,以及Stream的中间操作和终端操作。" 在Java 8及更高版本中,`Stream` API是一种强大的工具,它引入了一种新的处理数据的方式。`Stream`允许程序员以声明性方式处理集合数据,使得代码更加简洁且易于理解。以下是对`Stream` API的详细解释: ### Stream 的定义 `Stream` 是一组元素序列,支持各种操作以生成新序列或产生计算结果。它不存储数据,而是按需处理数据,并且可以是顺序的或并行的。 ### Stream 的创建 1. 从集合创建流: - 使用 `Collection.stream()` 创建顺序流:`Stream<String> stream = list.stream();` - 使用 `Collection.parallelStream()` 创建并行流:`Stream<String> parallelStream = list.parallelStream();` 2. 从数组创建流: - 对于对象数组,使用 `Arrays.stream(T[] array)`:`IntStream stream = Arrays.stream(intArray);` - 对于基本类型数组,有专门的方法,如 `IntStream`,`DoubleStream`,`LongStream` 等。 3. 使用 Stream 静态方法创建流: - `Stream.of(T... values)` 从给定的对象创建流:`Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);` - `Stream.iterate(T seed, UnaryOperator<T> next)` 从初始值迭代生成流:`Stream<Integer> stream2 = Stream.iterate(0, x -> x + 3).limit(4);` - `Stream.generate(Supplier<T> supplier)` 生成无限流,每次调用supplier函数获取元素:`Stream<Double> stream3 = Stream.generate(Math::random).limit(3);` ### Stream 操作 - 中间操作(Intermediate Operations): - 这些操作不会立即执行,而是构建一个操作链,只有在执行终端操作时才会执行。 - 常见的中间操作有:`filter()`, `map()`, `distinct()`, `sorted()`, `skip()`, `limit()` 等。 - 终端操作(Terminal Operations): - 终端操作是流处理的最后一个步骤,执行后流将不可再用。 - 常见的终端操作有:`forEach()`, `collect()`, `count()`, `findFirst()`, `anyMatch()`, `allMatch()`, `noneMatch()` 等。 ### Stream 特性 1. 惰性求值: - Stream 的操作是惰性的,这意味着中间操作不会立即执行,只有当终端操作被调用时,整个流水线才会被执行。 2. 不可变性: - Stream 不会修改其源数据,它生成的结果通常是一个新的集合或值。 3. 顺序与并行: - 顺序流按照元素的自然顺序执行操作,而并行流则利用多线程来并行处理元素,从而提高性能。 4. 短路操作: - 一些终端操作如 `findFirst()` 和 `anyMatch()` 可以在找到满足条件的第一个元素后立即停止,称为短路操作。 ### 示例 在给出的示例中,我们看到了如何通过 `Stream.of()` 生成一个整数流,通过 `iterate()` 方法创建一个递增序列,以及通过 `generate()` 生成随机数流。这些流随后通过 `limit()` 方法限制元素数量,并使用 `forEach()` 执行终端操作,打印出流中的元素。 通过理解并熟练运用 `Stream` API,开发者可以编写出更高效、更易读的代码,特别是在处理大量数据时,结合并行流,能够显著提升程序性能。