У меня есть собственная реализованная очередь.Очередь имеет два узла, фронт и конец.Теперь я хочу реализовать метод размера с потоком.Я хочу создать поток между двумя узлами и вернуть размер потока.
Но на данный момент я не знаю, как создать поток всех узлов между двумя узлами.
Узлы имеют переменную типа Node, указывающую на следующий в очереди, эта переменная равна нулю для последнего узла.
Я уже пытался создать Stream of Node.getNext и отфильтровать элементыПоток, который является нулевым.
public class Node<T> {
private Node<T> next;
private T element;
public Node(T element) {
this.element = element;
}
public Node<T> getNext() {
return next;
}
public void setNext(Node<T> next) {
this.next = next;
}
public T getElement() {
return element;
}
}
public class Queue<T> {
private Node<T> front;
private Node<T> back;
public int size() {
// This works but I want to use Stream
/*
int i = 0;
Node<T> n = front;
while (n.getNext() != null) {
i++;
n = n.getNext();
}
i++;
return i;
*/
return (int) Stream.iterate(
front, Node::getNext)
.filter(Objects::nonNull)
.count();
}
}
Я ожидаю число 3, но фактический результат равен
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.stream.Stream$1.tryAdvance(Stream.java:1226)
at java.base/java.util.Spliterator.forEachRemaining(Spliterator.java:326)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.ReduceOps$5.evaluateSequential(ReduceOps.java:257)
at java.base/java.util.stream.ReduceOps$5.evaluateSequential(ReduceOps.java:248)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.count(ReferencePipeline.java:605)
at Queue.size(Queue.java:46)
at Main.main(Main.java:19)