Две терминальные операции в одном выражении

Обновлено: 21.11.2024

Я делаю некоторую «алгебру» потоков Java 8, то есть я пытаюсь закодировать простую операционную операцию, которая принимает два потока в качестве входных данных и в результате дает другой поток.

Итак, у меня есть простой код, цель которого - напечатать второе по величине значение в серии чисел:

Эта программа не будет работать, если я не разделю однострочную операцию следующим образом:

Хранение операции в одной строке вызовет это исключение:

Исключение в потоке "main" java.lang.IllegalStateException: поток уже был обработан или закрыт .

Я понимаю, что это связано с присущей ему ленивой метода filter (). API объясняет:

Потоковые операции подразделяются на промежуточные (генерирующие поток) и терминальные (создающие побочные эффекты). Промежуточные операции всегда ленивы.

И фактически, трассировка стека показывает, что операция не выполняется, пока я не попытаюсь получить доступ к ее результату в следующей строке.

Является ли это поведение ошибочным дизайном в Java 8? Это ошибка? И самое главное, как я могу сохранить операцию в одной строке и заставить ее работать?

Читайте также: