Тесты Пообщаться с GPT Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
10 Окт 2023
2 мин
165

Проблема NullPointerException в Collectors.toMap при работе с null значениями

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

В Java возможна ситуация, когда при использовании метода Collectors.toMap происходит исключение NullPointerException. Это происходит в том случае, если одно из значений

В Java возможна ситуация, когда при использовании метода Collectors.toMap происходит исключение NullPointerException. Это происходит в том случае, если одно из значений в коллекции, которую мы хотим преобразовать в карту, равно null.

Возможно, это будет непонятно для новичков, ведь, по идее, карты могут содержать null значения. Однако, стоит знать, что Collectors.toMap не позволяет использовать null значения.

Рассмотрим пример. Пусть есть некий список объектов Person, где у каждого объекта есть поле id и поле name. Мы хотим преобразовать этот список в карту, где ключами будет id, а значениями — name. Однако, у одного из объектов Person поле name равно null.

class Person {
    int id;
    String name;

    Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    // геттеры и сеттеры
}

//...

List<Person> personList = new ArrayList<>();
personList.add(new Person(1, "Иван"));
personList.add(new Person(2, null));
personList.add(new Person(3, "Петр"));

Map<Integer, String> personMap = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName));

В данном случае при выполнении последней строки кода произойдёт NullPointerException, поскольку Collectors.toMap не позволяет использовать null значения.

Для обхода этой проблемы можно использовать метод Collectors.toMap с тремя аргументами, где последний аргумент является функцией, определяющей поведение в случае дублирования ключей. В данном случае мы можем просто вернуть первое значение, игнорируя дубликаты.

Map<Integer, String> personMap = personList.stream().collect(Collectors.toMap(Person::getId, Person::getName, (name1, name2) -> name1));

Таким образом, мы можем избежать NullPointerException при работе с Collectors.toMap, даже если в нашей коллекции присутствуют null значения.

Добавить комментарий