С появлением Java 12
Collectors.teeing() стал удобным инструментом для объединения двух независимых операций над потоком. Этот коллектор позволяет выполнять две разные операции над данными и объединять их результат с помощью функции-объединителя.🔍 Как это работает?
1️⃣ Указываем два коллектора для операций.
2️⃣ Задаём функцию, которая объединит результаты этих операций.
📌 Пример: Найдём сумму и среднее списка чисел.
import java.util.List;
import java.util.stream.Collectors;
public class TeeingExample {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
var result = numbers.stream().collect(
Collectors.teeing(
Collectors.summingInt(Integer::intValue), // Первая операция: сумма
Collectors.averagingInt(Integer::intValue), // Вторая операция: среднее
(sum, avg) -> "Sum: " + sum + ", Average: " + avg // Объединение результатов
)
);
System.out.println(result); // Вывод: Sum: 15, Average: 3.0
}
}
Это позволяет избавиться от многократного прохода по потоку, а код становится компактным и читаемым.
✨ Когда использовать?
1️⃣ Для выполнения нескольких независимых операций над данными потока.
2️⃣ Если нужно объединить результаты этих операций.
💡 Совет:
Collectors.teeing() особенно полезен, когда результаты независимых операций логически связаны. Например, для расчёта статистики или агрегации данных.#Java #Streams #Collectors #teeing
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2
Parallel Streams — это мощный инструмент в Java, который позволяет выполнять операции со стримами параллельно, используя несколько потоков. Однако параллельность не всегда улучшает производительность.
📌 Когда Parallel Streams полезны:
1️⃣ Большие объёмы данных. При обработке сотен тысяч или миллионов элементов параллельность помогает распределить нагрузку.
2️⃣ Тяжёлые вычисления. Если каждая операция над элементом занимает значительное время.
3️⃣ Многоядерные процессоры. Выигрыш заметен, если система поддерживает многопоточность.
📌 Пример: подсчёт простых чисел параллельно
import java.util.stream.LongStream;
public class ParallelStreamExample {
public static void main(String[] args) {
long start = System.currentTimeMillis();
// Подсчёт простых чисел от 1 до 10_000_000
long count = LongStream.rangeClosed(1, 10_000_000)
.parallel() // Параллельный стрим
.filter(ParallelStreamExample::isPrime)
.count();
long end = System.currentTimeMillis();
System.out.println("Количество простых чисел: " + count);
System.out.println("Время выполнения: " + (end - start) + " мс");
}
private static boolean isPrime(long n) {
if (n <= 1) return false;
for (long i = 2; i <= Math.sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
}
🔗 Что делает код:
1️⃣ Параллельный стрим (
parallel) делит диапазон на подзадачи. 2️⃣ Функция
isPrime проверяет, является ли число простым. 3️⃣ Элементы обрабатываются в нескольких потоках.
📌 Когда НЕ стоит использовать Parallel Streams:
✔️ Небольшие объёмы данных. Создание потоков может занять больше времени, чем выполнение задачи.
✔️ Лёгкие операции. Например, простое суммирование чисел.
✔️ Синхронизация или shared-state. Параллельные операции, изменяющие общий объект, могут привести к ошибкам.
✨ Совет: Перед использованием параллельных стримов измерьте производительность и убедитесь, что прирост скорости оправдывает сложность.
#Java #Streams #ParallelStreams #Оптимизация
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤🔥1