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.