Почему AbstractWrappingSpliterator использует буфер для частичного обхода - PullRequest
2 голосов
/ 10 июля 2020

Я читаю Java Исходный код Stream API и наткнулся на класс StreamSplitrators, который содержит реализации Spliterator для упаковки и делегирования класса spliterators (один из этих классов - AbstractWrappingSpliterator). Я знаю, что AbstractWrappingSpliterator - это оболочка для разделителя конвейера при первой операции. Таким образом, цель этого класса - предоставить Spliterator<P_OUT> на основе следующего параметра, который он получает в своем конструкторе

  1. PipelineHelper<P_OUT> ph
  2. Supplier<Spliterator<P_IN> spliteratorSupplier

Но я не понимаю:

  1. Почему при частичном обходе (метод tryAdvance) эта реализация сначала помещает элемент в буфер, а затем читать элемент из этого буфера, а затем использовать его, в чем преимущество использования здесь буфера?

  2. Почему этот класс использует буфер для частичного обхода (в методе tryAdvance), а при полном обходе - нет использовать этот буфер и просто делегировать элементы разделителя исходного кода методу pipelineHelper. wrapAndCopyInto?

Важное примечание: некоторые из упомянутых выше методов реализованы в подклассах AbstractWrappingSpliterator, но logi c - это то, что я описал выше

(в Java Do c частичный обход относится к использованию метода tryAdvance (), а полный обход относится к использованию метода forEachRemaining ())

...