为什么以下java 8代码在第二次调用get()?
时显示错误 Stream<String> aStream = Stream.concat(Stream.of("A"), Stream.of("B"));
String a = stream.findFirst().get();
String b = stream.findFirst().get();
&#34; aStream&#34;流应该看到两个值:&#34; A&#34;和&#34; B&#34;。但是,在第一个元素已经被消耗之后,尝试读取任何内容
java.lang.IllegalStateException: stream has already been operated upon or closed
它不是Java 8中的错误吗?首先,为什么消费的Stream.of()
- 已创建的流不会返回带有Optional
的{{1}}?其次,为什么isPresent()==false
没有正确地连接这样的Stream.concatenate()
- 创建的流?
答案 0 :(得分:6)
Stream.concatenate()
会连接两个Stream
。但是,一旦执行合并Stream
- stream.findFirst()
的终端操作,您就无法对Stream
执行任何其他操作。您只能运行Stream
的一个终端操作。这就是为什么它被称为“终端”。
如果要获取合并Stream
的多个元素,请使用其他终端操作,例如collect
:
List<String> list = stream.collect(Collectors.toList());
为了澄清,合并后的Stream
是一个Stream<String>
,而不是Stream
Stream
。因此,findFirst()
会消耗整个合并Stream
,而不仅仅是用于创建合并Stream
的第一个Stream
。
答案 1 :(得分:4)
因为Stream.findFirst()
是一个终端操作,终端操作只能在给定的流上运行一次。