2016-08-10 23 views
4

嗯,我一直认为Java8流中间操作根本没有做任何事情,直到终端操作在流上操作。流中间操作 - > IllegalStateException

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

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

_“中间操作根本不做任何事情”_这不是真的,他们创建一个新的流并将它与这个流连接起来,因为没有两个流可以依赖o在同一个源码流中,您不能调用多个操作。 _“...直到终端操作在流上运行”_。不** ** **流** **另一** **流**。 – zeroflagL

回答

4

您对Stream s有一个共同的误解。由于其流畅的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; 
+0

对,但那不是我的观点。 IllegalStateException表示Stream已关闭或已在其上进行操作。但为什么?我只使用中间操作。 –

+3

中间操作仍然在流上操作。一旦你有了一个,你不能有另一个。 – Mureinik

+0

中间操作以哪种方式在流上操作? 's.peek(System.out :: println).limit(1)'不会打印任何东西。 (1); –