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