gpt4 book ai didi

java-8 - Java 8 : In spite of avoiding terminal operation, 见 "stream has already been operated upon or closed"

转载 作者:行者123 更新时间:2023-12-04 14:08:48 26 4
gpt4 key购买 nike

以下 java 8 流没有任何终端操作。下面这个块是不是应该是懒惰的,因为我只有中间操作,还没有被终端操作操作过。当我运行这个块时,我得到“流已经被操作或关闭”。见 https://ideone.com/naR7GB

Stream<String> s = Stream.of("A", "B");
s.map(String::toUpperCase);
s.map(String::toLowerCase);

堆栈跟踪:
java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:94)
at java.util.stream.ReferencePipeline$StatelessOp.<init>(ReferencePipeline.java:618)
at java.util.stream.ReferencePipeline$3.<init>(ReferencePipeline.java:187)
at java.util.stream.ReferencePipeline.map(ReferencePipeline.java:186)

最佳答案

您需要申请第二个 map()到映射的实例:

s.map(String::toUpperCase).map(String::toLowerCase);

或者

Stream<String> s = Stream.of("A", "B");
Stream<String> s2 = s.map(String::toUpperCase);
Stream<String> s3 = s2.map(String::toLowerCase);

因为您只能对同一个流实例执行 1 个操作。

但请记住,您只能消费 s一次!所以要么你消费 s2s3 ,你不能同时消费。这就是为什么我们通常写一个链式调用,因为保留中间对象没有意义。

关于java-8 - Java 8 : In spite of avoiding terminal operation, 见 "stream has already been operated upon or closed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49410580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com