好吧,我一直以为Java8 Stream中间操作根本没有做任何事情,直到终端操作在流上运行。
那么为什么这段代码会抛出IllegalStateException
?
Stream<Integer> s = Stream.of(1, 2, 3);
s.limit(1);
s.limit(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;