Как Java Stream выполняет операции слияния потоков

Spring Boot Java

1. Введение

Java Stream ApiПредоставляет множество полезных API-интерфейсов, которые позволяют нам легко преобразовывать коллекции или несколько элементов одного типа в потоки для работы. Сегодня мы увидим, как объединитьStreamпоток.

2. Слияние потоков

StreamПредпосылка слияния потоков заключается в том, что типы элементов могут быть согласованы.

2.1 concat

Самый простой способ объединить потоки черезStream.concat()статический метод:

Stream<Integer> stream = Stream.of(1, 2, 3);
Stream<Integer> another = Stream.of(4, 5, 6);
Stream<Integer> concat = Stream.concat(stream, another);

List<Integer> collect = concat.collect(Collectors.toList());
List<Integer> expected = Lists.list(1, 2, 3, 4, 5, 6);

Assertions.assertIterableEquals(expected, collect);

Это слияние должно объединить два потока в тандеме:

2.2 Объединение нескольких потоков

Для слияния нескольких потоков мы также можем использовать описанный выше метод для выполнения «операции с куклой»:

Stream.concat(Stream.concat(stream, another), more);

Можно продолжать слой за слоем, если будет слишком много потоков для слияния, это будет выглядеть не очень четко.

Я представил один раньшеОперация плоской карты потока, его общий процесс может относиться к этой картинке внутри:

Поэтому мы можем пройтиflatmapЧтобы реализовать объединение нескольких потоков:

Stream<Integer> stream = Stream.of(1, 2, 3);
Stream<Integer> another = Stream.of(4, 5, 6);
Stream<Integer> third = Stream.of(7, 8, 9);
Stream<Integer> more = Stream.of(0);
Stream<Integer> concat = Stream.of(stream,another,third,more).
    flatMap(integerStream -> integerStream);
List<Integer> collect = concat.collect(Collectors.toList());
List<Integer> expected = Lists.list(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
Assertions.assertIterableEquals(expected, collect);

Этот метод заключается в том, чтобы сначала сгенерировать несколько потоков в качестве элементов для создания типаStream<Stream<T>>поток, а затем перейти кflatmapМозаичные операции сливаются.

2.3 Сторонние библиотеки

Существует множество сторонних библиотек для улучшенияStreamEx,Jooλможно объединить. Дополнительные библиотеки реактивного программированияReactor 3так же может бытьStreamПотоки объединяются в реактивные потоки, что может быть полезно в определенных сценариях. Покажите это здесь:

List<Integer> block = Flux.fromStream(stream)
                       .mergeWith(Flux.fromStream(another))
                                 .collectList()
                                 .block();

3. Резюме

если вы используетеJava Stream Api, объединитьStreamПотоки — это часто встречающиеся операции. Краткое введение в слияние сегодняStreamПотоковый способ, надеюсь, он работает для вас. яКод Фермер Маленький Толстый Брат, уделять больше внимания! Больше галантереи в продаже.

关注公众号:Felordcn获取更多资讯

Личный блог: https://felord.cn