Способы разделения Java 8 stream на два потока

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Java
Скопировать код
// Разделение потока на два в зависимости от определённого условия
Stream<String> fruits = Stream.of("яблоко", "банан", "вишня", "финик");

Map<Boolean, List<String>> splitMap =
    fruits.collect(Collectors.partitioningBy(s -> s.length() > 5));

List<String> longerThan5 = splitMap.get(true);  // Впечатляюще длинные бананы и вишни!
List<String> notLongerThan5 = splitMap.get(false); // Уютно-компактные яблочки и финики

Для разделения Stream на два List, подходит Collectors.partitioningBy. Предикат задаёт условие разделения элементов. Представьте, что вы отбираете фрукты по размеру, раскладывая их в две корзины. Всё абсолютно прозрачно!

Кинга Идем в IT: пошаговый план для смены профессии

Когда требуется больше двух вариантов? Используйте groupingBy

Если необходимо создать более двух групп, применяется Collectors.groupingBy(). С его помощью можно классифицировать данные по нескольким категориям, как если бы у вас был арсенал органайзеров. Однако учтите, что подход, описанный выше, не подходит для обработки бесконечных потоков данных.

Перед употреблением следует подумать о скорости и ресурсах

Важным аспектом при работе с потоками является внимание к скорости и занимаемой памяти. Берегите ресурсы, подготовив ArrayList под полный размер исходной коллекции, подобно забронированным местам на стоянке. Однако, не забывайте процедуру оценки объёма используемой памяти, чтобы предотвратить её избыточное потребление.

Для эффективного разделения воспользуйтесь teeing

Если вы работаете с Java 12 или более новой, можно использовать teeing collector для эффективного разделения потока. Подобно приготовлению двух разных блюд из одних и тех же ингредиентов без лишнего хаоса.

Сначала дублируйте, потом обрабатывайте

Следует запомнить: использованный поток данных восстановить больше не удастся. Если запланировано выполнение многих операций, лучше заранее сделать копию потока или сохранить данные до начала их обработки.

Понимайте своё окружение – ArrayList и разделение потоков

Крайне важно понимать условия, в которых работает ваш поток, учитывая время выполнения и требуемый объём памяти. Инициализация ArrayList с изначально определённым размером – это подобно готовности перед началом игры в шахматы. Но не забывайте о реализме размеров вашей "шахматной доски".

Создайте собственный разделитель потоков

Если хочется иметь уникальное решение, можно разработать свой кастомный коллектор. С помощью него можно разнообразно работать с потоком, но этот путь требует глубокого понимания работы Stream API.

Визуализация

Представьте себе, что одна дорога (Stream) расходится на две тропинки (Streams).

Markdown
Скопировать код
      🛣️ Исходный поток
         /        \
        /          \
🛤️ Поток 1   🛤️ Поток 2

Поток расслаивается, как дорога, в результате чего появляются две новые дорожки (partitioningBy), по каждой из которых элементы отправляются в своё путешествие.

Сложность выполнения – Сохраняйте баланс

Сохраняйте баланс между временной и пространственной сложностями при работе с потоками. Инициализация ArrayList полным размером помогает экономить время, однако это может значительно увеличивать потребление памяти. Выбирайте рациональный подход к планированию ресурсов.

Жизненный цикл потока – Контролируйте потоки

Приоритетным является порядок манипуляций с потоками данных. Как при употреблении суши, следует придерживаться определённой последовательности, насыщаясь каждым кусочком отдельно. То же относится и к операциям с потоками – их необходимо выполнять в правильной последовательности, чтобы избежать необходимости оперировать потоком повторно.

Полезные материалы

  1. Stream (Java Platform SE 8)официальная документация Java Stream API.
  2. Filter Java Stream to 1 and only 1 element – Stack Overflow — обсуждение на Stack Overflow о работе с потоками.
  3. Java 8 STREAMS Tutorial – YouTubeвидеоурок, посвящённый Java потокам.
  4. Teeing Collectors in Java 12 – Explanation of the teeing Collector — пояснение функционала teeing collectors в Java 12.
  5. Medium – Splitting a stream into multiple – Practical examplesпрактические примеры разделения Java потока на несколько.