Запрос, если поток был использован (без его потребления)

Каков наилучший способ запросить, был ли использован поток? Думали ли когда-нибудь о чем-то похожем на Stream::isConsumed?

Я признаю, что это похоже на следующий вопрос:

Как проверить, пуст ли поток Java 8?< /а>

Хотя кажется, что разница в том, что проверка потребления потока, по-видимому, не требует частичного потребления указанного потока. Применяются ли здесь ответы по ссылке выше?

Мой вариант использования аналогичен следующему:

/**
   ... This operation ensures, regardless whether the prefix or suffix stream is
   parallel, that the suffix stream is computed only after the prefix stream has
   been exhausted...
 */
public static <E> Stream<E> andThen(
        Stream<? extends E> stream,
        Supplier<? extends Stream<? extends E>> after);

EDIT (23.04.18), показывающий детали реализации, не так важен.


В andThen stream должен исчерпать перед добавлением оставшихся элементов, созданных after.

Конечно, некоторые могут предпочесть писать Spliterator, но даже в этом случае, если вы пишете trySplit, вы можете захотеть узнать, исчерпали ли дочерние элементы, разделенные от разделителя префикса, свои элементы (блокирующие, если нет...?) перед разделением суффикса; вы, вероятно, не захотите преждевременно использовать какие-либо префиксные элементы для этого.

Связано немного; вероятно ортогональный; будет ли вообще полезен заглядывающий сплитератор?

abstract boolean tryPeek(Consumer<? super E> action);
abstract boolean skip();
default boolean tryAdvance(Consumer<? super E> action) {return tryPeek(action) && skip();}

person bizness86    schedule 22.04.2018    source источник
comment
Я не думаю, что это допустимое использование потоков. Во-первых, Stream всегда следует считать бесконечным, если не указано иное. Во-вторых, ваш .filter(__ -> buffer.remainingCapacity() == 0) не является подходящим фильтром; предикат должен проверять элемент потока, который он фильтрует, а не внешнее состояние.   -  person daniu    schedule 22.04.2018
comment
Чтобы уточнить комментарий @daniu, весь ваш код основан на предположениях о порядке обработки ваших функций. Порядок обработки явно указывается как неопределенный.   -  person Holger    schedule 23.04.2018
comment
@Holger, не могли бы вы уточнить; поэтому для каждого элемента peek потребитель не может применяться перед предикатом filter, не может применяться перед функцией map? Возможно, я сделал это неправильно: stuartmarks.wordpress.com/ 09.01.2015/   -  person bizness86    schedule 24.04.2018
comment
@bizness86 в этой статье уже упоминается следствие неуказанного порядка оценки; в случае параллельного потока этот предикат с отслеживанием состояния выберет произвольный элемент, если существует несколько элементов с одинаковым значением свойства. В нем говорится, что будет делать задуманное с последовательным потоком, но следует подчеркнуть, что спецификация не гарантирует порядок оценки даже для последовательных потоков (такое предложение было в предварительных версиях, но оно было намеренно удалено до окончательный вариант).   -  person Holger    schedule 24.04.2018
comment
@ Хольгер, я вижу; да, это было бы предполагаемым поведением, если бы оно было параллельным; Я бы задокументировал соответственно. Я не знал, что для последовательных потоков нет гарантии; Моей главной заботой является вычисление/добавление оставшихся элементов, оставшихся в буфере, только после использования исходного потока. Связанный вопрос касался проверки пустого потока, но для этого, возможно, требовались потребляющие элементы. Кажется, что для проверки того, потребляется ли поток, не нужно потреблять элементы; однако нет возможности проверить Stream или Spliterator.   -  person bizness86    schedule 24.04.2018