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
相关产品推荐
相关产品推荐

