Я читаю Java Исходный код Stream API и наткнулся на класс StreamSplitrators
, который содержит реализации Spliterator для упаковки и делегирования класса spliterators (один из этих классов - AbstractWrappingSpliterator
). Я знаю, что AbstractWrappingSpliterator
- это оболочка для разделителя конвейера при первой операции. Таким образом, цель этого класса - предоставить Spliterator<P_OUT>
на основе следующего параметра, который он получает в своем конструкторе
PipelineHelper<P_OUT> ph
Supplier<Spliterator<P_IN> spliteratorSupplier
Но я не понимаю:
Почему при частичном обходе (метод tryAdvance
) эта реализация сначала помещает элемент в буфер, а затем читать элемент из этого буфера, а затем использовать его, в чем преимущество использования здесь буфера?
Почему этот класс использует буфер для частичного обхода (в методе tryAdvance), а при полном обходе - нет использовать этот буфер и просто делегировать элементы разделителя исходного кода методу pipelineHelper. wrapAndCopyInto
?
Важное примечание: некоторые из упомянутых выше методов реализованы в подклассах AbstractWrappingSpliterator
, но logi c - это то, что я описал выше
(в Java Do c частичный обход относится к использованию метода tryAdvance (), а полный обход относится к использованию метода forEachRemaining ())