Зарегистрируйтесь, чтобы продолжить обучение

Продвинутые стримы Java: Коллекции

Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.
List<User> users = List.of(new User(1, "Max"));

// Выведем всех пользователей на экран
users.stream()
    .forEach(System.out::println); // => User{id=1, name='Max'}

List<User> users2 = List.of(new User(3, "Nick"));

// Преобразуем списки пользователей в словарь
Map<Integer, String> namesMap = Stream.concat(users.stream(), users2.stream())
    .collect(Collectors.toMap(User::getId, User::getName, (v1, v2) -> v1));

System.out.println(namesMap); // => {1=Max, 3=Nick}

// Пользователь с самым коротким именем
User firstUser = users.stream()
    .sorted(Comparator.comparing(x -> x.getName().length()))
    .findFirst()
    .orElse(null);

System.out.println(firstUser); // => User{id=1, name='Max'}

// Пользователь с наименьшим id
User firstUserAgain = users.stream()
    .sorted(Comparator.comparingInt(x -> x.getId()))
    .findFirst()
    .orElseThrow(() -> new IllegalArgumentException("no users found"));

System.out.println(firstUserAgain); // => User{id=1, name='Max'}
private static Integer getUserId(String name) throws IllegalArgumentException {
    for (User user : users) {
        if (user.getName().equals(name)) {
            return user.getId();
        }
    }
    throw new IllegalArgumentException("No user with such name!");
}
// throws IllegalArgumentException
Integer id = getUserId("Ivan");
System.out.println(id);

Класс User

public class User {
    private Integer id;
    private String name;

    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("User{");
        sb.append("id=").append(id);
        sb.append(", name='").append(name).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

Метод flatMap()

Метод стрима flatMap() преобразует стрим стримов в один плоский стрим. Например, у нас есть двумерный массив и нам нужно сделать его плоским и отфильтровать его элементы:

int[][] array = {{2, 3}, {4, 5, 6}, {7, 8, 10}};

List<Integer> collect = Stream.of(array)          // Получаем стрим массивов Stream<Integer[]>
        .flatMap(element -> Stream.of(element))   // Stream<Integer>
        .filter(x -> x % 2 == 0)                  // filter only even numbers
        .collect(Collectors.toList());            // return a List

Функция, переданная в flatMap() в качестве параметра element -> Stream.of(element) создает свой вложенный стрим из каждого элемента стрима. А метод flatMap() выпрямляет этот стрим, делая его плоским. В итоге получаем стрим целых чисел. Этот же код можно записать немного короче, используя ссылку на метод:

List<Integer> collect = Stream.of(array)
        .flatMap(Stream::of)
        .filter(x -> x % 2 == 0)
        .collect(Collectors.toList());

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff