MST

星途 面试题库

面试题:Java中Stream流终止操作后不可复用性示例及原理

请用代码示例展示Java Stream流在执行终止操作后不可复用的特性,并简要解释背后的原理。
31.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码示例

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamReusabilityExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        Stream<Integer> stream = numbers.stream();

        // 第一次终止操作:计算总和
        int sum = stream.mapToInt(Integer::intValue).sum();
        System.out.println("Sum: " + sum);

        // 尝试再次使用同一个流进行另一个终止操作
        // 这将抛出IllegalStateException
        try {
            long count = stream.count();
            System.out.println("Count: " + count);
        } catch (IllegalStateException e) {
            System.out.println("Exception: " + e.getMessage());
        }
    }
}

原理解释

  1. 流的状态:Java Stream 流在执行过程中有一个状态,它记录了流的操作和当前处理位置等信息。
  2. 终止操作:终止操作(如 sum()count()forEach() 等)会消耗流,一旦流被消耗,它就到达了终止状态。这意味着流已经完成了其处理数据的生命周期。
  3. 不可复用性:因为流已经处于终止状态,其内部状态已被“消费”或改变,所以不能再次使用。如果尝试复用,就会抛出 IllegalStateException,提示流已被操作过,不允许再次操作。这是为了避免不一致的结果和复杂的流状态管理,保证流操作的确定性和可预测性。