Обратите внимание, что вы можете продлить Spliterators.AbstractSpliterator
.Тогда есть только tryAdvance
для реализации.
Таким образом, сложность реализации Spliterator
не выше.
Принципиальное отличие состоит в том, что Spliterator
'* tryAdvance
Метод вызывается только тогда, когда необходим новый элемент.Напротив, Stream.Builder
имеет хранилище , которое будет заполнено всеми элементами потока, прежде чем вы сможете получить поток.
Так что Spliterator
является первым выбором для всех видовленивых вычислений, а также когда у вас есть существующее хранилище, которое вы хотите обойти, чтобы избежать копирования данных.
Конструктор является первым выбором, когда создание элементов неоднородно, так что вы можетене выражают создание элемента по запросу.Подумайте о ситуациях, в которых вы в противном случае использовали бы Stream.of(…)
, но это оказывается негибким.
Например, у вас есть Stream.of(a, b, c, d, e)
, но теперь оказывается, что c
и d
являются необязательными.Таким образом, решение -
Stream.Builder<MyType> builder = Stream.builder();
builder.add(a).add(b);
if(someCondition) builder.add(c).add(d);
builder.add(e).build()
/* stream operations */
Другими вариантами использования являются этот ответ , где Consumer
был необходим для запроса существующего сплитератора и впоследствии возвращает значение обратно к Stream
,или этот ответ , где структура без произвольного доступа (иерархия классов) должна передаваться в обратном порядке.