两个对象之间的元素流?

时间:2019-06-12 08:34:47

标签: java queue java-stream

我有一个自己实现的队列。队列有两个节点,前端和后端。 现在,我想用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)

1 个答案:

答案 0 :(得分:0)

你很近。

但是您需要使用其他版本的iterate

Stream.iterate(front, x -> x != null, Node::getNext)
      .count()