流中间操作 - > IllegalStateException异常

时间:2016-08-10 06:47:33

标签: java java-8 java-stream

好吧,我一直以为Java8 Stream中间操作根本没有做任何事情,直到终端操作在流上运行。

那么为什么这段代码会抛出IllegalStateException

Stream<Integer> s = Stream.of(1, 2, 3);
s.limit(1);
s.limit(1);

1 个答案:

答案 0 :(得分:4)

您对Stream的常见误解。由于其流畅的API,许多开发人员的第一直觉是应用于流的每个方法都会返回它(类似于StringBuilder行为的方式 - myStringBuilder.append("Stack").append(" Overflow").append(" is").append(" is awesome!")

但事实并非如此。各种操作确实返回Stream但不是同一个对象,并且您获得的错误表示您尝试对同一对象应用两个操作,这是非法的。如果您使用纯粹流利的形式,这将按预期工作:

Stream<Integer> s = Stream.of(1, 2, 3);
Integer i = s.limit(1).limit(1).findFirst().orElse(null); // returns 1;