Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Стримы Java: Коллекции

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

Введение

// Метод для поиска четных чисел в списках на циклах
private static List<Integer> getEvenNumbers(List<Integer> input) {
    List<Integer> list = new ArrayList<>();
    for (Integer i : input) {
        if (i % 2 == 0) {
            list.add(i);
        }
    }
    return list;
}
List<Integer> list = List.of(1, 2, 3, 4, 5);
System.out.println(getEvenNumbers(list)); // => [2, 4]
// Напишем тот же самый метод, но с использованием стримов
private static List<Integer> getEvenNumbersPro(List<Integer> input) {
    return input.stream()
            .filter(num -> num % 2 == 0)
            .collect(Collectors.toList());
}
List<Integer> list = List.of(1, 2, 3, 4, 5);
System.out.println(getEvenNumbersPro(list)); // => [2, 4]

Работа с числами

List<Integer> numbers = List.of(1, -1, -8, 11, 20, 30, 44);
numbers.stream()
        .filter(num -> num > 0)
        .forEach(num -> {
            System.out.println(num);
        });

Результат работы:

1
11
20
30
44
int result = numbers.stream()
        .filter(num -> num > 0)
        .min((x, y) -> Integer.compare(x, y))
        .orElse(0);

System.out.println(result); //=> 1

// Сумму всех чисел можно посчитать разными способами

// 1 вариант
int sum1 = numbers.stream()
        .reduce((x, y) -> x + y)
        .orElse(0);
System.out.println("SUM: " + sum1);
// => SUM: 97

// 2 вариант
int sum2 = numbers.stream()
        .mapToInt(num -> num)
        .sum();
System.out.println("SUM2: " + sum2);
// => SUM2: 97

// Среднее арифметическое
double avg = numbers.stream()
        .mapToInt(x -> x)
        .average()
        .orElse(0);

System.out.println("AVG value: " + avg);
// => AVG value: 13.857142857142858

Работа со строками

// Приведем все непустые имена к верхнему регистру
List<String> names = List.of("Egor", "Max", "Ivan", "Petr", "Patric", "");
names = names.stream()
        .filter(name -> StringUtils.isNotBlank(name))
        .map(name -> name.toUpperCase())
        .collect(Collectors.toList());
System.out.println("Modified names list: " + names);
// => "Modified names list: [EGOR, MAX, IVAN, PETR, PATRIC]"

// Вариант на циклах
List<String> names2 = new ArrayList<>();
for (String name: names) {
    if (StringUtils.isNotBlank(name)) {
        names2.add(name.toUpperCase());
    }
}
System.out.println(names2);
//=> "[EGOR, MAX, IVAN, PETR, PATRIC]"


// Посчитаем количество имен, начинающихся определенной буквы
// вариант 1
long amount = names.stream()
        .filter(name -> StringUtils.isNotBlank(name))
        .filter(name -> name.startsWith("P"))
        .count();
System.out.println("Amount of names starts with P: " + amount);
//=> "Amount of names starts with P: 2"

// вариант 2
long amount2 = names.stream()
        .filter(name -> StringUtils.isNotBlank(name))
        .filter(name -> name.startsWith("P"))
        .collect(Collectors.counting());

System.out.println("Amount of names starts with P [2]: " + amount2);
// => "Amount of names starts with P [2]: 2"

Работа с объектами

// Создадим список пользователей
private static List<User> getUsersList() {
    List<User> users = new ArrayList<>();

    User user1 = new User();
    user1.setId(1);
    user1.setName("Egor");
    user1.setOnline(true);
    user1.setAge(10);
    users.add(user1);

    User user2 = new User();
    user2.setId(2);
    user2.setName("Max");
    user2.setOnline(false);
    user2.setAge(20);
    users.add(user2);

    User user3 = new User();
    user3.setId(3);
    user3.setName("Petr");
    user3.setOnline(true);
    user3.setAge(20);
    users.add(user3);

    User user4 = new User();
    user4.setId(4);
    user4.setName("Henry");
    user4.setOnline(true);
    user4.setAge(50);
    users.add(user4);

    User user5 = new User();
    user5.setId(5);
    user5.setName("Robert");
    user5.setOnline(false);
    user5.setAge(17);
    users.add(user5);

    return users;
}
List<User> users = getUsersList();

// а если users null???
if (users != null) {
    Map<Boolean, List<User>> isOnlineMap = users.stream()
            .filter(user -> Objects.nonNull(user))
            .collect(Collectors.groupingBy(user -> user.isOnline(), Collectors.toList()));
    System.out.println(isOnlineMap);
} else {
    System.out.println("List is null");
}

if (users != null) {
    Map<Boolean, List<User>> isAdultMap = users.stream()
            .collect(Collectors.groupingBy(user -> isAdult(user), Collectors.toList()));
    System.out.println(isAdultMap);
} else {
    System.out.println("List is null");
}

if (users != null) {
    Map<Integer, List<User>> ageMap = users.stream()
            .filter(user -> isAdult(user))
            .collect(Collectors.groupingBy(user -> user.getAge(), Collectors.toList()));
    System.out.println(ageMap);
} else {
    System.out.println("List is null");
}

private static boolean isAdult(User user) {
return user.getAge() >= 18;
}

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 30 ноября

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»