Обработка нуля в потоках Java с необязательным - PullRequest
0 голосов
/ 20 декабря 2018

Каков наилучший способ обработки нулевого значения, если у нас есть senario, как показано ниже

//mocking for demonstraton  
studentsByCourseRoster.setUsers(null);

studentsByCourseRoster.getUsers().stream().forEach(user -> {
    final UserDTOv2 userDTO = new UserDTOv2();
    userDTO.populateUserDataFromUserDTO(user, groupedUsers);
    users.add(userDTO);
});

Ответы [ 5 ]

0 голосов
/ 20 декабря 2018

Что было бы лучшим способом обработки нуля, если бы у нас был senario, как показано ниже

Самое простое решение для этого в вашей текущей схеме - сделать это с помощью оператора if.

Это не значит, что это лучший способ «справиться» с этой проблемой, а скорее лучший способ справиться с . Во-первых, это никогда не позволяет списку находиться в нулевом состоянии.как также упоминалось в комментариях.

Наличие пустого списка в качестве значения по умолчанию, это сэкономит вам огромное количество if проверок вокруг вашей кодовой базы в зависимости от того, сколько раз используется getUsers() исамое главное, вам не придется беспокоиться о NullPointerExeception, потому что они никогда не должны возникать.

С другой стороны, всякий раз, когда вы, кажется, видите себя вызывающим stream() в некоторой коллекции, а затем немедленно вызывающим forEach ты должен понять, что это неправильно;1) в том смысле, что вы можете легко вызвать forEach непосредственно в списке, т.е. studentsByCourseRoster.getUsers().forEach(...) 2) потоки и побочные эффекты просто не работают вместе.

0 голосов
/ 20 декабря 2018

С небольшим изменением ответа Мурейника я бы вместо этого использовал:

List<UserDTOv2> users = Optional.ofNullable(studentsByCourseRoster.getUsers())
        .orElse(Collections.emptyList())
        .stream()
        .map(user -> {
            UserDTOv2 userDTO = new UserDTOv2();
            userDTO.populateUserDataFromUserDTO(user, groupedUsers);
            return userDTO;
        }).collect(Collectors.toList());

Использование Stream.ofNullable в Java 9

List<UserDTOv2> users = Stream.ofNullable(studentsByCourseRoster.getUsers())
        .map(user -> {
            UserDTOv2 userDTO = new UserDTOv2();
            userDTO.populateUserDataFromUserDTO(user, groupedUsers);
            return userDTO;
        }).collect(Collectors.toList());
0 голосов
/ 20 декабря 2018

Вы также можете фильтровать нулевые объекты по фильтру (Objects :: nonNull):

studentsByCourseRoster.getUsers().stream().filter(Objects::nonNull).forEach(user -> {
    final UserDTOv2 userDTO = new UserDTOv2();
    userDTO.populateUserDataFromUserDTO(user, groupedUsers);
    users.add(userDTO);
});
0 голосов
/ 20 декабря 2018

Еще один способ написать это по желанию, в дополнение к правильному ответу @ Муреника.Нет необходимости создавать пустой список, мы можем передать выполнение без нулевого регистра только с:

    Optional.ofNullable(nullableUsers)
            .ifPresent(users -> users.forEach(user -> {
                // work with user
            }));

Необязательный Nullable также очень хорошо работает со вложенными нулевыми ссылками, например, у нас есть некоторая структура:

class User {
    @Getter
    Address address;
}

class Address {
    @Getter
    String street;
}

тогда вместо записи

if (user.getAddress() != null && user.getAddress().getStreet() != null) {
   // work with street
}

мы можем использовать Необязательно:

    Optional.ofNullable(user)
            .map(User::getAddress)
            .map(Address::getStreet)
            .ifPresent(street -> {
                // work with street
            });
0 голосов
/ 20 декабря 2018

Если вы хотите сохранить структуру одного оператора, вы можете использовать Optional.ofNullable и заменить null пустым списком:

Optional.ofNullable(studentsByCourseRoster.getUsers())
        .orElse(Collections.emptyList())
        .forEach(user -> {
                     final UserDTOv2 userDTO = new UserDTOv2();
                     userDTO.populateUserDataFromUserDTO(user, groupedUsers);
                     users.add(userDTO);
         });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...