我有一个自己实现的队列。队列有两个节点,前端和后端。 现在,我想用Stream实现一个size方法。 我想在两个节点之间创建一个Stream并返回Stream的大小。
但是在这一点上,我不知道如何制作两个节点之间所有节点的流。
节点的变量类型为Node,指向队列中的下一个节点,对于最后一个节点,该变量为null。
我已经尝试制作一个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)
答案 0 :(得分:0)
你很近。
但是您需要使用其他版本的iterate
。
Stream.iterate(front, x -> x != null, Node::getNext)
.count()