Java Stream 重复使用
引言
在使用 Java Stream 进行数据处理时,有时候我们希望能够多次使用同一个 Stream 对象。然而,一旦我们对 Stream 对象执行了终止操作(terminal operation),该 Stream 对象将会被关闭,无法再次使用。本文将介绍如何实现 Java Stream 的重复使用,以及相应的步骤和代码示例。
流程概述
使用 Java Stream 重复使用的步骤如下所示:
步骤 | 描述 |
---|---|
1 | 创建一个 Stream 对象 |
2 | 执行中间操作(Intermediate operations) |
3 | 执行终止操作(Terminal operation) |
4 | 重置 Stream 对象 |
5 | 再次执行中间操作和终止操作 |
下面将详细解释每个步骤需要做的事情,并提供相应的代码示例。
步骤解释
1. 创建一个 Stream 对象
首先,我们需要创建一个 Stream 对象。可以通过集合、数组或其他方式来创建 Stream 对象。例如,我们可以通过 Stream.of()
方法来创建一个包含多个元素的 Stream 对象。下面是一个创建 Stream 对象的示例代码:
Stream<String> stream = Stream.of("apple", "banana", "orange");
2. 执行中间操作
接下来,我们可以对 Stream 对象执行中间操作。中间操作是对数据进行处理的一系列操作,例如过滤、映射、排序等。这些操作不会立即执行,而是在终止操作被调用时才会执行。下面是一个对 Stream 对象执行中间操作的示例代码:
Stream<String> filteredStream = stream.filter(s -> s.startsWith("a"));
上述代码通过 filter()
方法过滤出以字母 "a" 开头的元素,并将过滤后的结果赋值给一个新的 Stream 对象 filteredStream
。
3. 执行终止操作
执行终止操作是为了获取 Stream 对象中的最终结果。终止操作会触发 Stream 对象中的中间操作逐个执行,并生成最终结果。常见的终止操作包括 collect()
、forEach()
、count()
等。下面是一个执行终止操作的示例代码:
List<String> resultList = filteredStream.collect(Collectors.toList());
上述代码通过 collect()
方法将 Stream 对象中的元素收集到一个新的列表中。
4. 重置 Stream 对象
在执行终止操作后,Stream 对象将被关闭,无法再次使用。为了重复使用 Stream 对象,我们需要重新创建一个 Stream 对象。下面是一个重置 Stream 对象的示例代码:
stream = Stream.of("apple", "banana", "orange");
通过重新创建 Stream 对象,我们可以继续对其执行中间操作和终止操作。
5. 再次执行中间操作和终止操作
重置 Stream 对象后,我们可以再次对其执行中间操作和终止操作。下面是一个再次执行操作的示例代码:
Stream<String> mappedStream = stream.map(String::toUpperCase);
List<String> resultList2 = mappedStream.collect(Collectors.toList());
上述代码通过 map()
方法将 Stream 对象中的元素转换为大写,并将转换后的结果收集到一个新的列表中。
代码示例
下面是一个完整的示例代码,包含了创建 Stream 对象、执行中间操作和终止操作的全部步骤:
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
// 创建 Stream 对象
Stream<String> stream = Stream.of("apple", "banana", "orange");
// 执行中间操作
Stream<String> filteredStream = stream.filter(s -> s.startsWith("a"));
// 执行终止操作
List<String> resultList = filteredStream.collect(Collectors.toList());
// 重置 Stream 对象
stream = Stream.of("apple", "banana", "orange");
// 再次执行中间操作和终止操作
Stream<String> mappedStream = stream.map(String::toUpperCase);
List<String> resultList2 = mappedStream.collect(Collectors.toList());
// 打印结果