BaseStream

BaseStream<T, S extends BaseStream<T, S>> — общий родитель Stream<T>, IntStream, LongStream и DoubleStream.

  • T — тип элементов;
  • S — конкретный тип stream; self-bound позволяет parallel() вернуть тот же вид stream.

Методы

МетодСмысл
iterator()terminal-доступ через Iterator
spliterator()terminal-доступ через Spliterator
isParallel()текущий режим pipeline
sequential()последовательный режим
parallel()параллельный режим
unordered()разрешить не сохранять encounter order
onClose(Runnable)добавить close-handler
close()запустить handlers и закрыть связанные ресурсы
try (Stream<String> lines = Files.lines(path)) {
    long errors = lines
            .filter(line -> line.contains("ERROR"))
            .count();
}

Большинство stream из коллекций не владеет ресурсом, и закрывать его не обязательно. Stream из файла владеет открытым каналом, поэтому нужен try-with-resources.

onClose-handlers выполняются при close; если несколько падают, первая ошибка выбрасывается, остальные добавляются как suppressed. Терминальная операция сама по себе не обязана вызывать close.

Ограничения

  • stream одноразовый: после terminal operation повторное использование недопустимо;
  • iterator() и spliterator() являются terminal operations над pipeline;
  • parallel() не гарантирует ускорение;
  • unordered() не перемешивает элементы, а снимает требование encounter order для последующих операций.

На собеседовании

Зачем второй параметр S? Чтобы fluent-методы возвращали конкретный подтип stream.

Нужно ли закрывать list.stream()? Обычно нет, у него нет внешнего ресурса.

Закрывает ли count() файловый stream? Нет, нужен close/try-with-resources.

Что делает unordered()? Разрешает pipeline не соблюдать исходный порядок, но не обещает случайную перестановку.

Связано: Stream API, Методы интерфейса Stream, Работа с исключениями в Java.