与Stream.of()的Java 8错误 - 像流和连接它们?

时间:2018-05-09 09:23:28

标签: java concatenation java-stream illegalstateexception

为什么以下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() - 创建的流?

2 个答案:

答案 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()是一个终端操作,终端操作只能在给定的流上运行一次。