Java 8 bug与Stream.of()类似并连接它们?
为什么下面的java 8代码在第二次调用get()时显示错误 这不是Java8中的一个bug吗?首先,为什么已消费的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()-的终端操作,您就不能对该流执行任何其他操作。您只能运行流的一个终端操作。这就
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());