Поток элементов между двумя объектами? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть собственная реализованная очередь.Очередь имеет два узла, фронт и конец.Теперь я хочу реализовать метод размера с потоком.Я хочу создать поток между двумя узлами и вернуть размер потока.

Но на данный момент я не знаю, как создать поток всех узлов между двумя узлами.

Узлы имеют переменную типа 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)

1 Ответ

0 голосов
/ 12 июня 2019

Вы были близки.

Но вам нужно использовать другую версию iterate.

Stream.iterate(front, x -> x != null, Node::getNext)
      .count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...