Stream API в Java: Потужні рішення які покращать ваш код

Stream API з’явився в Java 8 і докорінно змінив підхід до обробки колекцій. Якщо ви досі пишете вкладені цикли для фільтрації та трансформації даних, ця стаття для вас. Розглянемо 5 практичних прикладів, які покажуть всю потужність Stream API.

1. Фільтрація та трансформація в один рядок

Завдання: Отримати список email-адрес активних користувачів, відсортованих за алфавітом.

Традиційний підхід:

List<User> users = getUserList();
List<String> activeEmails = new ArrayList<>();

for (User user : users) {
    if (user.isActive()) {
        activeEmails.add(user.getEmail());
    }
}

Collections.sort(activeEmails);
Java

З Stream API:

List<String> activeEmails = users.stream()
    .filter(User::isActive)
    .map(User::getEmail)
    .sorted()
    .collect(Collectors.toList());
Java

Код став коротшим, читабельнішим і декларативним. Ми описуємо “що” робити, а не “як”.

2. Групування даних: створюємо Map без зусиль

Завдання: Згрупувати товари за категоріями.

Map<String, List<Product>> productsByCategory = products.stream()
    .collect(Collectors.groupingBy(Product::getCategory));
Java

А якщо потрібно отримати кількість товарів у кожній категорії?

Map<String, Long> countByCategory = products.stream()
    .collect(Collectors.groupingBy(
        Product::getCategory,
        Collectors.counting()
    ));
Java

3. Пошук і перевірка: anyMatch, allMatch, noneMatch

Завдання: Перевірити, чи є серед замовлень такі, що перевищують певну суму.

boolean hasLargeOrders = orders.stream()
    .anyMatch(order -> order.getTotal() > 1000);
Java

Перевірити, чи всі користувачі підтвердили email:

boolean allVerified = users.stream()
    .allMatch(User::isEmailVerified);
Java

Переконатися, що немає заблокованих акаунтів:

boolean noBlocked = users.stream()
    .noneMatch(User::isBlocked);
Java

4. Робота з Optional: уникаємо NullPointerException

Stream API чудово працює з Optional, роблячи код безпечнішим.

Optional<User> premiumMyUser = users.stream()
    .filter(User::isPremium)
    .findFirst();

// Безпечне отримання значення
String userName = premiumMyUser
    .map(User::getName)
    .orElse("Guest");
Java

Або виконати дію, якщо елемент знайдено:

users.stream()
    .filter(u -> u.getId().equals(userId))
    .findFirst()
    .ifPresent(user -> sendNotification(user));
Java

5. Паралельна обробка: прискорюємо код

Для великих обсягів даних можна використовувати паралельні стріми.

long count = largeList.parallelStream()
    .filter(item -> expensiveOperation(item))
    .count();
Java

Увага! Паралельні стріми не завжди швидші. Використовуйте їх для:

  • Великих колекцій (тисячі елементів)
  • Складних обчислень
  • Коли операції незалежні одна від одної

А тепер все до купи

Реальний приклад – розрахунок середньої ціни активних товарів у певній категорії:

OptionalDouble averagePrice = products.stream()
    .filter(Product::isActive)
    .filter(p -> p.getCategory().equals("Electronics"))
    .mapToDouble(Product::getPrice)
    .average();

averagePrice.ifPresent(avg -> 
    System.out.println("Середня ціна: " + avg)
);
Java

Висновок

Stream API робить код:

  • Читабельнішим – зрозуміло з першого погляду
  • Коротшим – менше boilerplate коду
  • Безпечнішим – інтеграція з Optional
  • Швидшим – можливість паралелізації

Почніть використовувати стріми в своїх проектах вже сьогодні, і ви побачите, як зміниться якість вашого коду!

  • javaadmin

    Супер крутий Dev

    Related Posts

    Java Collections Framework: List, Set чи Map?

    Уявіть, що ви прийшли на склад інтернет-магазину. На одній полиці товари лежать строго в тому порядку, у якому їх привезли. На іншій — кожен предмет унікальний, і дублікати сюди не кладуть за жодних умов. А в кутку стоїть картотека, де кожному товару відповідає унікальний штрих-код. У світі Java цей склад називається Java Collections Framework (JCF). Це потужний набір інтерфейсів та класів, який дозволяє ефективно керувати групами об’єктів. Проте у…

    JBang: Як вивчати Java легко

    Java довгий час мала репутацію мови, яка потребує занадто багато «ритуалів»: створення структури каталогів, налаштування Maven або Gradle, написання довгих pom.xml лише для того, щоб протестувати одну ідею. JBang — це інструмент, який змінює правила гри, дозволяючи запускати Java-код так само легко, як скрипти на Python або Bash. Що таке JBang? JBang — це утиліта для командного рядка, яка дозволяє створювати, редагувати та запускати самодостатні Java-скрипти. Основна ідея…

    Залишити відповідь

    Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

    Цікаве

    Dependency Injection у Spring: пояснюємо на пальцях

    • Автор javaadmin
    • 31 Липня, 2026
    • 14 views
    Dependency Injection у Spring: пояснюємо на пальцях

    Java Collections Framework: List, Set чи Map?

    • Автор javaadmin
    • 31 Липня, 2026
    • 29 views
    Java Collections Framework: List, Set чи Map?

    Оптимізуємо це: GraalVM Native Image, Leyden та CRaC

    • Автор javaadmin
    • 17 Липня, 2026
    • 57 views
    Оптимізуємо це: GraalVM Native Image, Leyden та CRaC

    JBang: Як вивчати Java легко

    • Автор javaadmin
    • 12 Травня, 2026
    • 130 views
    JBang: Як вивчати Java легко

    Agent Skills: Що це таке і чому про це варто знати

    • Автор javaadmin
    • 13 Квітня, 2026
    • 233 views
    Agent Skills: Що це таке і чому про це варто знати

    Dependency Injection в Java

    • Автор javaadmin
    • 9 Грудня, 2025
    • 407 views
    Dependency Injection в Java