Интерфейс Stream<T>
- Параметры типа:
-
T- тип элементов потока
- Все суперинтерфейсы:
- AutoCloseable, BaseStream<T,Stream<T>>
public interface Stream<T> extends BaseStream<T,Stream<T>>
Последовательность элементов, поддерживающая последовательные и параллельные агрегированные операции. Следующий пример демонстрирует агрегированную операцию с использованием Stream и IntStream:
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum(); В этом примере widgets является Collection<Widget>. Мы создаем поток объектов Widget через Collection.stream(), фильтруем его, чтобы получить поток, содержащий только красные виджеты, и преобразуем его в поток значений int , представляющих вес каждого красного виджета. Затем этот поток суммируется для получения общего веса.
Помимо Stream, являющегося потоком ссылок на объекты, существуют примитивные специализации для IntStream, LongStream и DoubleStream, все из которых называются "потоками" и соответствуют характеристикам и ограничениям, описанным здесь.
Для выполнения вычислений операции потока операции объединяются в потоковую цепочку. Потоковая цепочка состоит из источника (который может быть массивом, коллекцией, функцией-генератором, каналом ввода-вывода и т. д.), нуля или более промежуточных операций (которые преобразуют поток в другой поток, например, filter(Predicate)) и терминальной операции (которая производит результат или побочный эффект, например, count() или forEach(Consumer)). Потоки ленивые; вычисление данных источника выполняется только при инициализации терминальной операции, и элементы источника потребляются только по мере необходимости.
Коллекции и потоки, хотя и имеют некоторые поверхностные сходства, преследуют разные цели. Коллекции в первую очередь ориентированы на эффективное управление элементами и доступ к ним. Напротив, потоки не предоставляют средства для прямого доступа к элементам или их изменения и вместо этого ориентированы на декларативное описание их источника и вычислительных операций, которые будут выполняться агрегированно над этим источником. Однако, если предоставленные операции потока не предлагают желаемой функциональности, операции BaseStream.iterator() и BaseStream.spliterator() могут использоваться для выполнения контролируемого обхода.
Потоковую цепочку, например, пример с "виджетами", можно рассматривать как запрос к источнику потока. Если источник не был явно спроектирован для одновременного изменения (например, ConcurrentHashMap), может возникнуть непредсказуемое или ошибочное поведение при изменении источника потока во время запроса.
Большинство операций потока принимают параметры, описывающие поведение, заданное пользователем, например, лямбда-выражение w -> w.getWeight() , переданное mapToInt в примере выше. Для сохранения правильного поведения эти параметры поведения:
- должны быть не вмешивающимися (они не изменяют источник потока); и
- в большинстве случаев должны быть бессостоятельными (их результат не должен зависеть от состояния, которое может измениться во время выполнения потоковой цепочки).
Такие параметры всегда являются экземплярами функционального интерфейса, такого как Function, и часто представляют собой лямбда-выражения или ссылки на методы. Если не указано иное, эти параметры должны быть не равными null.
Над потоком следует выполнять операции (вызывая промежуточную или терминальную операцию потока) только один раз. Это исключает, например, "разветвлённые" потоки, где один и тот же источник питает две или более цепочки обработки, или несколько обходов одного и того же потока. Реализация потока может выбросить IllegalStateException, если она обнаружит, что поток повторно используется. Однако, поскольку некоторые операции потока могут возвращать свой приемник вместо нового объекта потока, может быть невозможно обнаружить повторное использование во всех случаях.
Поток имеет метод BaseStream.close() и реализует AutoCloseable, но почти все экземпляры потока фактически не нуждаются в закрытии после использования. Как правило, закрытие требуется только для потоков, чей источник является каналом ввода-вывода (таким как возвращаемые Files.lines(Path, Charset)). Большинство потоков поддерживаются коллекциями, массивами или функциями генерации, которые не требуют специального управления ресурсами. (Если поток требует закрытия, он может быть объявлен как ресурс в операторе try-с-ресурсами.)
Потоковые цепочки могут выполняться либо последовательно, либо в параллельном режиме. Этот режим выполнения является свойством потока. Потоки создаются с первоначальным выбором последовательного или параллельного выполнения. (Например, Collection.stream() создает последовательный поток, а Collection.parallelStream() - параллельный.) Этот выбор режима выполнения может быть изменён методами BaseStream.sequential() или BaseStream.parallel(), и может быть запрошен методом BaseStream.isParallel().
- С:
- 1.8
- См. также:
-
IntStream,LongStream,DoubleStream, java.util.stream
Вложенные классы
| Модификатор и тип | Интерфейс и описание |
|---|---|
static interface |
Stream.Builder<T> Изменяемый билдер для |
Методы
| Модификатор и Тип | Метод и Описание |
|---|---|
boolean |
allMatch(Predicate<? super T> predicate) Возвращает значение, указывающее, соответствуют ли все элементы этого потока заданному предикату. |
boolean |
anyMatch(Predicate<? super T> predicate) Возвращает значение, указывающее, соответствуют ли какие-либо элементы этого потока заданному предикату. |
static <T> Stream.Builder<T> |
builder() Возвращает билдер для |
<R,A> R |
collect(Collector<? super T,A,R> collector) Выполняет операцию мутабельного сокращения над элементами этого потока с использованием |
<R> R |
collect(Supplier<R> supplier,
BiConsumer<R,? super T> accumulator,
BiConsumer<R,R> combiner) Выполняет операцию мутабельного сокращения над элементами этого потока. |
static <T> Stream<T> |
concat(Stream<? extends T> a,
Stream<? extends T> b) Создаёт лениво конкатенированный поток, элементы которого — все элементы первого потока, за которыми следуют все элементы второго потока. |
long |
count() Возвращает количество элементов в этом потоке. |
Stream<T> |
distinct() Возвращает поток, содержащий уникальные элементы (согласно |
static <T> Stream<T> |
empty() Возвращает пустой последовательный |
Stream<T> |
filter(Predicate<? super T> predicate) Возвращает поток, содержащий элементы этого потока, которые соответствуют заданному предикату. |
Optional<T> |
findAny() Возвращает |
Optional<T> |
findFirst() Возвращает |
<R> Stream<R> |
flatMap(Function<? super T,? extends Stream<? extends R>> mapper) Возвращает поток, содержащий результаты замены каждого элемента этого потока содержимым сопоставленного потока, полученного применением заданной функции сопоставления к каждому элементу. |
DoubleStream |
flatMapToDouble(Function<? super T,? extends DoubleStream> mapper) Возвращает |
IntStream |
flatMapToInt(Function<? super T,? extends IntStream> mapper) Возвращает |
LongStream |
flatMapToLong(Function<? super T,? extends LongStream> mapper) Возвращает |
void |
forEach(Consumer<? super T> action) Выполняет действие для каждого элемента этого потока. |
void |
forEachOrdered(Consumer<? super T> action) Выполняет действие для каждого элемента этого потока в порядке встреч потока, если поток имеет определённый порядок встреч. |
static <T> Stream<T> |
generate(Supplier<T> s) Возвращает бесконечный последовательный неупорядоченный поток, где каждый элемент генерируется заданным |
static <T> Stream<T> |
iterate(T seed,
UnaryOperator<T> f) Возвращает бесконечный последовательный упорядоченный |
Stream<T> |
limit(long maxSize) Возвращает поток, содержащий элементы этого потока, укороченные до длины не более |
<R> Stream<R> |
map(Function<? super T,? extends R> mapper) Возвращает поток, содержащий результаты применения данной функции к элементам этого потока. |
DoubleStream |
mapToDouble(ToDoubleFunction<? super T> mapper) Возвращает |
IntStream |
mapToInt(ToIntFunction<? super T> mapper) Возвращает |
LongStream |
mapToLong(ToLongFunction<? super T> mapper) Возвращает |
Optional<T> |
max(Comparator<? super T> comparator) Возвращает максимальный элемент этого потока согласно заданному |
Optional<T> |
min(Comparator<? super T> comparator) Возвращает минимальный элемент этого потока согласно заданному |
boolean |
noneMatch(Predicate<? super T> predicate) Возвращает значение, указывающее, не соответствуют ли какие-либо элементы этого потока заданному предикату. |
static <T> Stream<T> |
of(T... values) Возвращает последовательный упорядоченный поток, элементами которого являются указанные значения. |
static <T> Stream<T> |
of(T t) Возвращает последовательный |
Stream<T> |
peek(Consumer<? super T> action) Возвращает поток, содержащий элементы этого потока, дополнительно выполняя указанное действие над каждым элементом по мере потребления элементов из результирующего потока. |
Optional<T> |
reduce(BinaryOperator<T> accumulator) Выполняет сокращение над элементами этого потока, используя ассоциативную функцию накопления, и возвращает |
T |
reduce(T identity,
BinaryOperator<T> accumulator) Выполняет сокращение над элементами этого потока, используя заданное значение тождества и ассоциативную функцию накопления, и возвращает результирующее значение. |
<U> U |
reduce(U identity,
BiFunction<U,? super T,U> accumulator,
BinaryOperator<U> combiner) Выполняет сокращение над элементами этого потока, используя заданные функции тождества, накопления и комбинирования. |
Stream<T> |
skip(long n) Возвращает поток, содержащий оставшиеся элементы этого потока после отбрасывания первых |
Stream<T> |
sorted() Возвращает поток, содержащий элементы этого потока, отсортированные по естественному порядку. |
Stream<T> |
sorted(Comparator<? super T> comparator) Возвращает поток, содержащий элементы этого потока, отсортированные согласно заданному |
Object[] |
toArray() Возвращает массив, содержащий элементы этого потока. |
<A> A[] |
toArray(IntFunction<A[]> generator) Возвращает массив, содержащий элементы этого потока, используя заданную функцию |
Методы, унаследованные от интерфейса java.util.stream.BaseStream
close, isParallel, iterator, onClose, parallel, sequential, spliterator, unordered Методы
filter
Stream<T> filter(Predicate<? super T> predicate)
Возвращает поток, состоящий из элементов этого потока, которые соответствуют заданному предикату.
- Параметры:
-
predicate- не мешающий, бессостоятельный предикат, применяемый к каждому элементу для определения того, следует ли его включать - Возвращает:
- новый поток
map
<R> Stream<R> map(Function<? super T,? extends R> mapper)
Возвращает поток, состоящий из результатов применения заданной функции к элементам этого потока.
- Параметры типа:
-
R- Тип элементов нового потока - Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу - Возвращает:
- новый поток
mapToInt
IntStream mapToInt(ToIntFunction<? super T> mapper)
Возвращает IntStream , состоящий из результатов применения заданной функции к элементам этого потока.
- Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу - Возвращает:
- новый поток
mapToLong
LongStream mapToLong(ToLongFunction<? super T> mapper)
Возвращает LongStream , состоящий из результатов применения заданной функции к элементам этого потока.
- Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу - Возвращает:
- новый поток
mapToDouble
DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)
Возвращает DoubleStream , состоящий из результатов применения заданной функции к элементам этого потока.
- Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу - Возвращает:
- новый поток
flatMap
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
Возвращает поток, состоящий из результатов замены каждого элемента этого потока содержимым отображаемого потока, полученного путем применения предоставленной функции отображения к каждому элементу. Каждый отображаемый поток closed после того, как его содержимое будет помещено в этот поток. (Если отображаемый поток null используется пустой поток.)
- Примечание к API:
- Операция
flatMap()приводит к применению преобразования один-ко-многим к элементам потока, а затем к выравниванию результирующих элементов в новый поток.Примеры.
Если
ordersявляется потоком заказов на покупку, и каждый заказ на покупку содержит коллекцию позиций, то следующее создает поток, содержащий все позиции во всех заказах:orders.flatMap(order -> order.getLineItems().stream())...
Если
pathявляется путем к файлу, то следующее создает потокwords, содержащихся в этом файле:Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8); Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));Функцияmapper, переданная вflatMap, разделяет строку, используя простое регулярное выражение, на массив слов, а затем создает поток слов из этого массива. - Параметры типа:
-
R- Тип элементов нового потока - Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу, которая создает поток новых значений - Возвращает:
- новый поток
flatMapToInt
IntStream flatMapToInt(Function<? super T,? extends IntStream> mapper)
Возвращает IntStream , состоящий из результатов замены каждого элемента этого потока содержимым отображаемого потока, полученного путем применения предоставленной функции отображения к каждому элементу. Каждый отображаемый поток closed после того, как его содержимое будет помещено в этот поток. (Если отображаемый поток null используется пустой поток.)
- Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу, которая создает поток новых значений - Возвращает:
- новый поток
- См. также:
flatMap(Function)
flatMapToLong
LongStream flatMapToLong(Function<? super T,? extends LongStream> mapper)
Возвращает LongStream , состоящий из результатов замены каждого элемента этого потока содержимым отображаемого потока, полученного путем применения предоставленной функции отображения к каждому элементу. Каждый отображаемый поток closed после того, как его содержимое будет помещено в этот поток. (Если отображаемый поток null используется пустой поток.)
- Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу, которая создает поток новых значений - Возвращает:
- новый поток
- См. также:
flatMap(Function)
flatMapToDouble
DoubleStream flatMapToDouble(Function<? super T,? extends DoubleStream> mapper)
Возвращает DoubleStream , состоящий из результатов замены каждого элемента этого потока содержимым отображаемого потока, полученного путем применения предоставленной функции отображения к каждому элементу. Каждый отображаемый поток closed после того, как его содержимое будет помещено в этот поток. (Если отображаемый поток null используется пустой поток.)
- Параметры:
-
mapper- не мешающая, бессостоятельная функция, применяемая к каждому элементу, которая создает поток новых значений - Возвращает:
- новый поток
- См. также:
flatMap(Function)
distinct
Stream<T> distinct()
Возвращает поток, состоящий из различных элементов (в соответствии с Object.equals(Object)) этого потока.
Для упорядоченных потоков выбор различных элементов стабилен (для дублированных элементов сохраняется элемент, появляющийся первым в порядке встречи). Для неупорядоченных потоков гарантии стабильности не даются.
- Примечание к API:
- Сохранение стабильности для
distinct()в параллельных конвейерах относительно дорого (требует, чтобы операция действовала как полный барьер, со значительными накладными расходами на буферизацию), и стабильность часто не требуется. Использование неупорядоченного источника потока (например,generate(Supplier)) или удаление ограничения упорядочивания с помощьюBaseStream.unordered()может привести к значительно более эффективному выполнению дляdistinct()в параллельных конвейерах, если семантика вашей ситуации это позволяет. Если требуется согласованность с порядком встреч, и вы испытываете низкую производительность или использование памяти сdistinct()в параллельных конвейерах, переход к последовательному выполнению с помощьюBaseStream.sequential()может улучшить производительность. - Возвращает:
- новый поток
sorted
Stream<T> sorted()
Возвращает поток, состоящий из элементов этого потока, отсортированных в соответствии с естественным порядком. Если элементы этого потока не Comparable, может быть выброшено java.lang.ClassCastException при выполнении терминальной операции.
Для упорядоченных потоков сортировка стабильна. Для неупорядоченных потоков гарантии стабильности не даются.
- Возвращает:
- новый поток
sorted
Stream<T> sorted(Comparator<? super T> comparator)
Возвращает поток, состоящий из элементов этого потока, отсортированных в соответствии с предоставленным Comparator.
Для упорядоченных потоков сортировка стабильна. Для неупорядоченных потоков гарантии стабильности не даются.
- Параметры:
-
comparator- не мешающий, бессостоятельныйComparator, который будет использоваться для сравнения элементов потока - Возвращает:
- новый поток
peek
Stream<T> peek(Consumer<? super T> action)
Возвращает поток, состоящий из элементов этого потока, дополнительно выполняя предоставленное действие для каждого элемента по мере потребления элементов из результирующего потока.
Для параллельных конвейеров потоков действие может вызываться в любое время и в любом потоке, в котором элемент становится доступным благодаря операции выше по потоку. Если действие изменяет общее состояние, оно отвечает за обеспечение необходимой синхронизации.
- Примечание к API:
- Этот метод существует в основном для поддержки отладки, когда вы хотите видеть элементы по мере их прохождения через определенную точку в конвейере:
Stream.of("one", "two", "three", "four") .filter(e -> e.length() > 3) .peek(e -> System.out.println("Filtered value: " + e)) .map(String::toUpperCase) .peek(e -> System.out.println("Mapped value: " + e)) .collect(Collectors.toList()); - Параметры:
-
action- не мешающее действие, которое нужно выполнить над элементами по мере их потребления из потока - Возвращает:
- новый поток
ограничение
Stream<T> limit(long maxSize)
Возвращает поток, состоящий из элементов этого потока, усечённых до длины не более maxSize.
- Примечание API:
- Хотя
limit()обычно является недорогой операцией в последовательных потоковых конвейерах, она может быть довольно дорогостоящей в упорядоченных параллельных конвейерах, особенно для больших значенийmaxSize, так какlimit(n)ограничено возвращением не только любых n элементов, но и первых n элементов в порядке их встреч. Использование неупорядоченного источника потока (такого какgenerate(Supplier)) или удаление ограничения порядка с помощьюBaseStream.unordered()может привести к значительному увеличению скоростиlimit()в параллельных конвейерах, если это допускают семантика вашей ситуации. Если требуется согласованность с порядком встречи, а вы сталкиваетесь с плохой производительностью или использованием памяти при использованииlimit()в параллельных конвейерах, переход к последовательному выполнению с помощьюBaseStream.sequential()может повысить производительность. - Параметры:
-
maxSize- количество элементов, до которого должен быть ограничен поток - Возвращает:
- новый поток
- Выбрасывает:
-
IllegalArgumentException- еслиmaxSizeотрицательно
пропустить
Stream<T> skip(long n)
Возвращает поток, состоящий из оставшихся элементов этого потока после отбрасывания первых n элементов потока. Если в этом потоке содержится меньше, чем n элементов, будет возвращён пустой поток.
- Примечание API:
- Хотя
skip()обычно является недорогой операцией в последовательных потоковых конвейерах, она может быть довольно дорогостоящей в упорядоченных параллельных конвейерах, особенно для больших значенийn, так какskip(n)ограничено пропуском не только любых n элементов, но и первых n элементов в порядке их встречи. Использование неупорядоченного источника потока (такого какgenerate(Supplier)) или удаление ограничения порядка с помощьюBaseStream.unordered()может привести к значительному увеличению скоростиskip()в параллельных конвейерах, если это допускают семантика вашей ситуации. Если требуется согласованность с порядком встречи, а вы сталкиваетесь с плохой производительностью или использованием памяти при использованииskip()в параллельных конвейерах, переход к последовательному выполнению с помощьюBaseStream.sequential()может повысить производительность. - Параметры:
-
n- количество ведущих элементов для пропуска - Возвращает:
- новый поток
- Выбрасывает:
-
IllegalArgumentException- еслиnотрицательно
forEach
void forEach(Consumer<? super T> action)
Выполняет действие для каждого элемента этого потока.
Это оператор терминального звена.
Поведение этой операции явно не детерминировано. Для параллельных потоковых конвейеров эта операция не гарантирует соблюдение порядка встречи потока, так как это потребовало бы жертвы преимущества параллелизма. Для любого данного элемента действие может быть выполнено в любое время и в любом потоке, который выберет библиотека. Если действие обращается к общему состоянию, оно отвечает за предоставление необходимой синхронизации.
- Параметры:
-
action- невоздействующее действие, которое нужно выполнить над элементами
forEachOrdered
void forEachOrdered(Consumer<? super T> action)
Выполняет действие для каждого элемента этого потока в порядке встречи потока, если поток имеет определённый порядок встречи.
Это оператор терминального звена.
Эта операция обрабатывает элементы по одному, в порядке встречи, если он существует. Выполнение действия для одного элемента происходит до выполнения действия для последующих элементов, но для любого данного элемента действие может быть выполнено в любом выбранном библиотекой потоке.
- Параметры:
-
action- невоздействующее действие, которое нужно выполнить над элементами - См. также:
forEach(Consumer)
toArray
Object[] toArray()
Возвращает массив, содержащий элементы этого потока.
- Возвращает:
- массив, содержащий элементы этого потока
toArray
<A> A[] toArray(IntFunction<A[]> generator)
Возвращает массив, содержащий элементы этого потока, используя предоставленную функцию generator для выделения возвращаемого массива, а также любые дополнительные массивы, которые могут потребоваться для разбиения или изменения размера.
- Примечание API:
- Функция-генератор принимает целое число, которое является размером желаемого массива, и создаёт массив нужного размера. Это можно лаконично выразить с помощью ссылки на конструктор массива:
Person[] men = people.stream() .filter(p -> p.getGender() == MALE) .toArray(Person[]::new); - Параметры типа:
-
A- тип элемента возвращаемого массива - Параметры:
-
generator- функция, которая создаёт новый массив нужного типа и заданной длины - Возвращает:
- массив, содержащий элементы в этом потоке
- Выбрасывает:
-
ArrayStoreException- если тип runtime возвращаемого массива из генератора массива не является супертипом типа runtime каждого элемента в этом потоке
reduce
T reduce(T identity,
BinaryOperator<T> accumulator) Выполняет сведение элементов этого потока, используя предоставленное значение тождества и функцию накопления ассоциативности, и возвращает сведённое значение. Это эквивалентно:
T result = identity;
for (T element : this stream)
result = accumulator.apply(result, element)
return result; , но не ограничено выполнением последовательно.
Значение identity должно быть тождеством для функции аккумулятора. Это означает, что для всех t, accumulator.apply(identity, t) равно t. Функция accumulator должна быть функцией ассоциативности.
- Примечание API:
- Суммирование, минимум, максимум, среднее значение и конкатенация строк — все являются частными случаями сведения. Суммирование потока чисел может быть выражено как:
Integer sum = integers.reduce(0, (a, b) -> a+b);
или:Integer sum = integers.reduce(0, Integer::sum);
Хотя это может показаться более окольным способом выполнения агрегации по сравнению с простым изменением текущей суммы в цикле, операции сведения более эффективно выполняются параллельно, без необходимости дополнительной синхронизации и с значительно меньшим риском гонок данных.
- Параметры:
-
identity- значение тождества для функции накопления -
accumulator- ассоциативная, невоздействующая, бессостоятельная функция для объединения двух значений - Возвращает:
- результат сведения
reduce
Optional<T> reduce(BinaryOperator<T> accumulator)
Выполняет сведение элементов этого потока, используя функцию накопления ассоциативности, и возвращает описание сведённого значения, если таковое имеется. Это эквивалентно:
boolean foundAny = false;
T result = null;
for (T element : this stream) {
if (!foundAny) {
foundAny = true;
result = element;
}
else
result = accumulator.apply(result, element);
}
return foundAny ? Optional.of(result) : Optional.empty(); , но не ограничено выполнением последовательно.
Функция accumulator должна быть функцией ассоциативности.
- Параметры:
-
accumulator- ассоциативная, невоздействующая, бессостоятельная функция для объединения двух значений - Возвращает:
- объект
Optional, описывающий результат сведения - Выбрасывает:
-
NullPointerException- если результатом сведения является null - См. также:
-
reduce(Object, BinaryOperator),min(Comparator),max(Comparator)
reduce
<U> U reduce(U identity,
BiFunction<U,? super T,U> accumulator,
BinaryOperator<U> combiner) Выполняет сведение элементов этого потока, используя предоставленное значение тождества, функции накопления и объединения. Это эквивалентно:
U result = identity;
for (T element : this stream)
result = accumulator.apply(result, element)
return result; , но не ограничено выполнением последовательно.
Значение identity должно быть тождеством для функции объединения. Это означает, что для всех u, combiner(identity, u) равно u. Кроме того, функция combiner должна быть совместима с функцией accumulator; для всех u и t, должно выполняться следующее:
combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)
- Примечание API:
- Многие сокращения, использующие эту форму, можно представить проще с помощью явного сочетания операций
mapиreduce. Функцияaccumulatorдействует как объединённый преобразователь и аккумулятор, что может быть иногда более эффективным, чем раздельные преобразование и сокращение, например, когда знание ранее уменьшенного значения позволяет избежать некоторых вычислений. - Параметры типа:
-
U- тип результата - Параметры:
-
identity- значение тождества для функции комбинирования -
accumulator- ассоциативная, не влияющая на состояние, бессостоятельная функция для включения дополнительного элемента в результат -
combiner- ассоциативная, не влияющая на состояние, бессостоятельная функция для объединения двух значений, которая должна быть совместима с функцией аккумулятора - Возвращает:
- результат сокращения
- См. также:
-
reduce(BinaryOperator),reduce(Object, BinaryOperator)
collect
<R> R collect(Supplier<R> supplier,
BiConsumer<R,? super T> accumulator,
BiConsumer<R,R> combiner) Выполняет операцию изменяемого сокращения над элементами этого потока. Изменяемое сокращение — это такое сокращение, в котором уменьшенное значение является изменяемым контейнером результата, например, ArrayList, а элементы включаются путём обновления состояния результата, а не заменой результата. Это даёт результат, эквивалентный:
R result = supplier.get();
for (T element : this stream)
accumulator.accept(result, element);
return result;
Как и reduce(Object, BinaryOperator), операции collect могут быть параллельными, не требуя дополнительной синхронизации.
Это конечная операция.
- Примечание API:
- Существует много существующих классов в JDK, чьи сигнатуры хорошо подходят для использования с ссылками на методы в качестве аргументов для
collect(). Например, следующее накопит строки вArrayList:List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);Следующее возьмёт поток строк и объединит их в одну строку:
String concat = stringStream.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) .toString(); - Параметры типа:
-
R- тип результата - Параметры:
-
supplier- функция, создающая новый контейнер результата. Для параллельного выполнения эта функция может вызываться несколько раз и должна возвращать новое значение каждый раз. -
accumulator- ассоциативная, не влияющая на состояние, бессостоятельная функция для включения дополнительного элемента в результат -
combiner- ассоциативная, не влияющая на состояние, бессостоятельная функция для объединения двух значений, которая должна быть совместима с функцией аккумулятора - Возвращает:
- результат сокращения
collect
<R,A> R collect(Collector<? super T,A,R> collector)
Выполняет операцию изменяемого сокращения над элементами этого потока с использованием Collector. Collector инкапсулирует функции, используемые в качестве аргументов к collect(Supplier, BiConsumer, BiConsumer), позволяя повторно использовать стратегии сбора и комбинировать операции сбора, такие как группировка или разделение на несколько уровней.
Если поток параллельный, а Collector является concurrent, и поток не упорядочен или сборщик unordered, то будет выполнено конкурентное сокращение (см. Collector для деталей по конкурентному сокращению).
Это конечная операция.
При выполнении параллельно, могут быть созданы, заполнены и объединены несколько промежуточных результатов для поддержания изоляции изменяемых структур данных. Поэтому даже при выполнении параллельно с не потокобезопасными структурами данных (такими как ArrayList), дополнительная синхронизация не требуется для параллельного сокращения.
- Примечание API:
- Следующее накопит строки в ArrayList:
List<String> asList = stringStream.collect(Collectors.toList());
Следующее классифицирует
Personобъекты по городам:Map<String, List<Person>> peopleByCity = personStream.collect(Collectors.groupingBy(Person::getCity));Следующее классифицирует
Personобъекты по штату и городу, комбинируя дваCollectorвместе:Map<String, Map<String, List<Person>>> peopleByStateAndCity = personStream.collect(Collectors.groupingBy(Person::getState, Collectors.groupingBy(Person::getCity))); - Параметры типа:
-
R- тип результата -
A- промежуточный тип накопления дляCollector - Параметры:
-
collector-Collectorописывающий сокращение - Возвращает:
- результат сокращения
- См. также:
-
collect(Supplier, BiConsumer, BiConsumer),Collectors
min
Optional<T> min(Comparator<? super T> comparator)
Возвращает минимальный элемент этого потока в соответствии с предоставленным Comparator. Это частный случай сокращения.
Это конечная операция.
- Параметры:
-
comparator- не влияющая на состояние, бессостоятельная функция сравнения элементов этого потока - Возвращает:
- объект
Optionalописывающий минимальный элемент этого потока, или пустой объектOptionalесли поток пуст - Исключения:
-
NullPointerException- если минимальный элемент null
max
Optional<T> max(Comparator<? super T> comparator)
Возвращает максимальный элемент этого потока в соответствии с предоставленным Comparator. Это частный случай сокращения.
Это конечная операция.
- Параметры:
-
comparator- не влияющая на состояние, бессостоятельная функция сравнения элементов этого потока - Возвращает:
- объект
Optionalописывающий максимальный элемент этого потока, или пустой объектOptionalесли поток пуст - Исключения:
-
NullPointerException- если максимальный элемент null
count
long count()
Возвращает количество элементов в этом потоке. Это частный случай сокращения и эквивалентно:
return mapToLong(e -> 1L).sum();
Это конечная операция.
- Возвращает:
- количество элементов в этом потоке
anyMatch
boolean anyMatch(Predicate<? super T> predicate)
Возвращает, соответствуют ли какие-либо элементы этого потока предоставленному предикату. Может не оценивать предикат на всех элементах, если это не необходимо для определения результата. Если поток пуст, то возвращается false, и предикат не оценивается.
- Примечание API:
- Этот метод вычисляет экзистенциальную квантификацию предиката по элементам потока (для некоторого x P(x)).
- Параметры:
-
predicate- не влияющая на состояние, бессостоятельная функция предиката для применения к элементам этого потока - Возвращает:
-
trueесли какие-либо элементы потока соответствуют предоставленному предикату, иначеfalse
allMatch
boolean allMatch(Predicate<? super T> predicate)
Возвращает, соответствуют ли все элементы этого потока предоставленному предикату. Может не оценивать предикат на всех элементах, если это не необходимо для определения результата. Если поток пуст, то возвращается true, и предикат не оценивается.
- Примечание API:
- Этот метод вычисляет универсальную квантификацию предиката по элементам потока (для всех x P(x)). Если поток пуст, то квантификация считается пустым удовлетворением и всегда
true(независимо от P(x)). - Параметры:
-
predicate- не влияющая на состояние, бессостоятельная функция предиката для применения к элементам этого потока - Возвращает:
-
trueесли все элементы потока соответствуют предоставленному предикату или поток пуст, иначеfalse
noneMatch
boolean noneMatch(Predicate<? super T> predicate)
Возвращает, не соответствуют ли элементы этого потока предоставленному предикату. Может не оценивать предикат на всех элементах, если это не необходимо для определения результата. Если поток пуст, то возвращается true, и предикат не оценивается.
- Примечание API:
- Этот метод вычисляет универсальную квантификацию отрицания предиката по элементам потока (для всех x ~P(x)). Если поток пуст, квантификация считается пустым удовлетворением и всегда
true, вне зависимости от P(x). - Параметры:
-
predicate- не влияющая на состояние, бессостоятельная функция предиката для применения к элементам этого потока - Возвращает:
-
trueесли ни один элемент потока не соответствует предоставленному предикату или поток пуст, иначеfalse
findFirst
Optional<T> findFirst()
Возвращает Optional, описывающую первый элемент этого потока, или пустой Optional если поток пуст. Если у потока нет порядка встреч, то может быть возвращён любой элемент.
- Возвращает:
Optionalописывающую первый элемент этого потока, или пустойOptionalесли поток пуст- Исключение:
-
NullPointerException- если выбранный элемент равен null
findAny
Optional<T> findAny()
Возвращает Optional, описывающую некоторый элемент потока, или пустой Optional если поток пуст.
Поведение этой операции явно не детерминировано; она свободна выбрать любой элемент в потоке. Это позволяет получить максимальную производительность в параллельных операциях; стоимость заключается в том, что несколько вызовов на одном источнике могут не возвращать одинаковый результат. (Если желается стабильный результат, используйте findFirst() вместо этого.)
- Возвращает:
Optionalописывающую некоторый элемент этого потока, или пустойOptionalесли поток пуст- Исключение:
-
NullPointerException- если выбранный элемент равен null - См. также:
findFirst()
builder
static <T> Stream.Builder<T> builder()
Возвращает билдер для Stream.
- Параметры типа:
-
T- тип элементов - Возвращает:
- билдер потока
empty
static <T> Stream<T> empty()
Возвращает пустой последовательный Stream.
- Параметры типа:
-
T- тип элементов потока - Возвращает:
- пустой последовательный поток
of
static <T> Stream<T> of(T t)
Возвращает последовательный Stream, содержащий один элемент.
- Параметры типа:
-
T- тип элементов потока - Параметры:
-
t- единственный элемент - Возвращает:
- последовательный поток из одного элемента
of
@SafeVarargs static <T> Stream<T> of(T... values)
Возвращает упорядоченный последовательный поток, элементы которого — указанные значения.
- Параметры типа:
-
T- тип элементов потока - Параметры:
-
values- элементы нового потока - Возвращает:
- новый поток
iterate
static <T> Stream<T> iterate(T seed,
UnaryOperator<T> f) Возвращает бесконечный упорядоченный последовательный Stream, полученный итеративным применением функции f к начальному элементу seed, создавая Stream, состоящий из seed, f(seed), f(f(seed)), и т. д.
Первый элемент (позиция 0) в Stream будет предоставленным seed. Для n > 0, элемент на позиции n, будет результатом применения функции f к элементу на позиции n - 1.
- Параметры типа:
-
T- тип элементов потока - Параметры:
-
seed- начальный элемент -
f- функция, применяемая к предыдущему элементу для создания нового элемента - Возвращает:
- новый последовательный
Stream
generate
static <T> Stream<T> generate(Supplier<T> s)
Возвращает бесконечный неупорядоченный последовательный поток, где каждый элемент генерируется предоставленным Supplier. Это подходит для генерации постоянных потоков, потоков случайных элементов и т. д.
- Параметры типа:
-
T- тип элементов потока - Параметры:
-
s-Supplierгенерируемых элементов - Возвращает:
- новый бесконечный неупорядоченный последовательный
Stream
concat
static <T> Stream<T> concat(Stream<? extends T> a,
Stream<? extends T> b) Создаёт лениво конкатенированный поток, элементы которого — все элементы первого потока, за которыми следуют все элементы второго потока. Результирующий поток упорядочен, если оба входных потока упорядочены, и параллелен, если любой из входных потоков параллелен. При закрытии результирующего потока вызываются обработчики закрытия для обоих входных потоков.
- Примечание реализации:
- Будьте осторожны при создании потоков из многократной конкатенации. Доступ к элементу глубоко конкатенированного потока может привести к глубоким цепочкам вызовов или даже к
StackOverflowException. - Параметры типа:
-
T- Тип элементов потока - Параметры:
-
a- первый поток -
b- второй поток - Возвращает:
- конкатенацию двух входных потоков
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.