You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java拼接Stream后出现Spliterator错误:NoSuchElementException

问题:Stream拼接后创建Iterator抛出NoSuchElementException异常

尝试从两个Stream拼接而成的Stream创建Iterator时,抛出NoSuchElementException异常。问题出在Spliterator上,迭代器无法识别Stream中存在元素。尽管原两个Stream类型相同,但拼接后的Stream似乎包含两个Spliterator,尝试转为数组时也会触发该错误。

相关代码

Stream<Node> nodeStream = Stream.of(firstNode);
while (!goal) {
    Iterator<Node> iterator = nodeStream.iterator();
    Node head = iterator.next();
    Stream<Node> tail = Stream.generate(iterator::next).filter(n -> n != head);
    Node[] newNodes = head.expand(end);
    if (newNodes.length == 1) {
        goal = true;
        endNode = newNodes[0];
    }
    nodeStream = Stream.concat(Arrays.stream(newNodes), tail);
    nodeStream = nodeStream.sorted(Comparator.comparing(n -> n.routeCost(end)));
}

错误信息

Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Spliterators$1Adapter.next(Spliterators.java:688)
    at java.base/java.util.stream.StreamSpliterators$InfiniteSupplyingSpliterator$OfRef.tryAdvance(StreamSpliterators.java:1358)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:292)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:298)
    at java.base/java.util.stream.Streams$ConcatSpliterator.tryAdvance(Streams.java:723)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:292)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
    at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
    at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:298)
    at java.base/java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681)
    at java.base/java.util.Spliterators$1Adapter.next(Spliterators.java:687)
    at inf.ed.ac.uk.Route.generateRoute(Route.java:35)

背景说明

我正在实现基于GPS坐标的A*算法,逻辑为:扩展首个节点(返回16个新节点),将其加入Stream并排序,重复此过程。

Node类代码

public class Node {
    boolean goal = false;
    Node parent;
    final LngLat coords;
    LngLat.Compass direction;
    double cost;
    private Route route;

    public Node[] expand(LngLat end) {
        ArrayList<Node> nodes = new ArrayList<>();
        for (LngLat.Compass direction: LngLat.Compass.values()) {
            Node node = new Node(coords.nextPosition(direction), this, direction);

            if (noFlyClear(node)) {
                if (!route.contains(node)) {
                    if (node.coords.closeTo(end)) {
                        node.goal = true;
                        return new Node[]{node};
                    }
                    nodes.add(node);
                    route.visited.add(node);
                }
            }

        }
        return nodes.toArray(Node[]::new);
    } 
}

我已改为使用ArrayList,但仍不清楚最初的问题根源。


内容的提问来源于stack exchange,提问作者Alistair Tait

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:20:24