後指定者崩潰我有一些代碼看起來像這樣:流:CONCAT
Stream a = Streams.from(...).map(...);
Stream b = Streams.from(...);
Stream c = Stream.concat(a, b);
c.toArray();
(Streams.from(Iterable)
創建從一個可迭代流 - 被視爲Iterable#stream()
不存在)
最後一行崩潰但有:
Exception in thread "main" java.lang.IllegalStateException: Accept exceeded fixed size of 266
at java.util.stream.Nodes$FixedNodeBuilder.accept(Nodes.java:1224)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:576)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:255)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
at ... (my code)
266實際上是流的大小a
。流b
是11個元素。
我做了一些測試。從代碼中刪除map(...)
使其工作。 下面的小例子也可以工作:
Stream x = Stream.of(1, 2).map(w -> w + 1);
Stream y = Stream.of(3, 4);
Stream z = Stream.concat(x, y);
z.toArray();
在這一點上我是非常懷疑我的映射功能,然而,這只是正常工作:
Object[] a = Streams.from(...).map(...).toArray();
Object[] b = Streams.from(...).toArray();
Object[] c = ArrayUtils.addAll(a, b);
是否有可能解釋這種怪異的流API微妙行爲?
提到流b
是從調用映射函數時被填充的集合構建而成。
_它可能是相關的提到,流b是由一個集合構建的,當映射函數被調用時被填充._請告訴我們。提供一個MCVE。 –
什麼是Streams.from()或Stream.from()?這些不在JDK API中。另外,你的任何實現都有自己的分割器嗎?如果是這樣,請問你能表明一下嗎? –
*可能有必要提到的是,流b是由調用映射函數時被填充的集合構建的。在調用映射函數之前,不會填充底層流b的集合,直到執行c.toArray()時纔會調用映射函數(因爲流是懶惰尋求的)。因此,在流操作時正在修改其中一個流源,這違反了流規範的非干擾要求。 –