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());
        
        // 打印结果