Java 8 bug与Stream.of()类似并连接它们?

Java 8 bug与Stream.of()类似并连接它们?,java,concatenation,java-stream,illegalstateexception,Java,Concatenation,Java Stream,Illegalstateexception,为什么下面的java 8代码在第二次调用get()时显示错误 这不是Java8中的一个bug吗?首先,为什么已消费的Stream.of()-创建的流不返回可选的,且isPresent()==false?第二,为什么Stream.concatenate()不能正确连接这样的Stream.of()-创建的流?Stream.concatenate()会连接这两个流。但是,一旦执行组合的流-Stream.findFirst()-的终端操作,您就不能对该流执行任何其他操作。您只能运行流的一个终端操作。这就

为什么下面的java 8代码在第二次调用get()时显示错误

这不是Java8中的一个bug吗?首先,为什么已消费的
Stream.of()
-创建的流不返回
可选的
,且
isPresent()==false
?第二,为什么
Stream.concatenate()
不能正确连接这样的
Stream.of()
-创建的流?

Stream.concatenate()
会连接这两个
流。但是,一旦执行组合的
-
Stream.findFirst()
-的终端操作,您就不能对该
执行任何其他操作。您只能运行
流的一个终端操作
。这就是为什么它被称为“终端”

如果要获得组合
流的多个元素
,请使用不同的终端操作,例如
收集

List<String> list = stream.collect(Collectors.toList());
List List=stream.collect(Collectors.toList());
为了澄清,组合的
是单个
,而不是
流。因此,
findFirst()
消耗整个组合的
,而不仅仅是用于创建组合的
流的第一个
流。concatenate()
将两个
连接起来。但是,一旦执行组合的
-
Stream.findFirst()
-的终端操作,您就不能对该
执行任何其他操作。您只能运行
流的一个终端操作
。这就是为什么它被称为“终端”

如果要获得组合
流的多个元素
,请使用不同的终端操作,例如
收集

List<String> list = stream.collect(Collectors.toList());
List List=stream.collect(Collectors.toList());

为了澄清,组合的
是单个
,而不是
流。因此,
findFirst()
消耗整个组合的
,而不仅仅是用于创建组合的
流的第一个
,因为
Stream.findFirst()
是一个终端操作,而终端操作只能在给定流上运行一次。

因为
stream.findFirst()
是一个终端操作,而终端操作只能在给定流上运行一次。

aStream
stream
应该是同一个变量吗?可能值得注意的是,在C#中,相反,附加到流的操作不会影响流本身:而且,@Vlad仍然不能满足OP的要求,即返回两次
“a”
,而不是
“a”
“B”
。您认为
concat
不能正常工作的假设是完全没有根据的
Stream.concat(Stream.of(“A”)、Stream.of(“B”)
的行为与
Stream.of(“A”、“B”)
的行为完全相同。aStream
Stream
应该是同一个变量吗?可能值得注意的是,在C中,与此相反,附加到流的操作不会影响流本身:,而@Vlad仍然不能满足OP的要求,即返回两次
“A”
,而不是
“A”
“B”
。您认为
concat
不能正常工作的假设是完全没有根据的
Stream.concat(Stream.of(“A”),Stream.of(“B”)
的行为与
Stream.of(“A”,“B”)
的行为完全相同。那么,如何使用给定流的第一个元素并接收其余元素的流呢?我的意思是,如何获得头部和尾部,就像在Scala中通常做的那样?这应该是非常简单的用例?为什么在Java中这样做如此困难?@pablo53如果您需要给定数量的流元素,那么只需限制和收集:
List List=aStream.limit(2.collect(Collectors.toList())
,然后只需使用列表:
List.get(0);列表。获取(1)
。流并不是真正设计成集合的功能。。。因此,您可能只需要使用普通的集合API来收集和拆分列表。那么,如何使用给定流的第一个元素并接收其余元素的流呢?我的意思是,如何获得头部和尾部,就像在Scala中通常做的那样?这应该是非常简单的用例?为什么在Java中这样做如此困难?@pablo53如果您需要给定数量的流元素,那么只需限制和收集:
List List=aStream.limit(2.collect(Collectors.toList())
,然后只需使用列表:
List.get(0);列表。获取(1)
。流并不是真正设计成集合的功能。。。因此,您可能只需要使用普通的收集API收集和拆分列表
List<String> list = stream.collect(Collectors.toList());