Есть ли способ использовать метод 'orElseGet' из 'Необязательно', чтобы создать новый список, когда он пуст? - PullRequest
3 голосов
/ 25 мая 2019

Скажем, у нас есть класс в структуре, как показано ниже:

class Resource{
   String id; 
   String name;
   List<String> friends;
}

Есть ли способ получить список, используя 'Необязательно' таким образом:

Optional.of(resource.getFriends()).map(friends -> {
    friends.add("John");
    return friends;
}).orElseGet(
    //do something here.
)

Новыйсписок ожидается, если раньше никого не было.

Ответы [ 2 ]

2 голосов
/ 25 мая 2019

Это зависит от ваших более точных функциональных требований.Я представляю пару вариантов.

Если вы просто хотите список, который содержит друзей ресурса и Джона:

    List<String> listWithJohn = Optional.ofNullable(resource.getFriends())
            .orElseGet(ArrayList::new);
    listWithJohn.add("John");

Как упомянул в комментарии Василий Бурк, начиная с Java 9,Вместо этого можно выполнить инициализацию списка, используя Objects.requireNonNullElseGet:

    List<String> listWithJohn
            = Objects.requireNonNullElseGet(resource.getFriends(), ArrayList::new);

Если вместо этого вы хотите, чтобы Джон был добавлен в друзья ресурса, я предлагаю использовать метод getFriends, где можно редактировать:

/** @return The list of friends, not null */
public List<String> getFriends() {
    if (friends == null) {
        friends = new ArrayList<>();
    }
    return friends;
}

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

РЕДАКТИРОВАТЬ:

есть способ сделать только в одной строке лямбда-кода?

    friends = friends == null ? new ArrayList<>() : friends;
    return friends;

Но я бы нашел его менее читабельным (и там нет лямбды, это всего лишь одна строка).Или, если вы хотите, чтобы это было полностью загадочно:

    return friends = friends == null ? new ArrayList<>() : friends;

Не рекомендуется.

0 голосов
/ 25 мая 2019
    //so resource object in here has an emtpy list of friends
    final Resource resource = new Resource();
    //this will print out "John"
    final List<String> someFriends = Optional.ofNullable(resource.friends).orElse(new ArrayList<String>() {{add("John");}});
    System.out.println(someFriends);
    resource.friends = new ArrayList<>();
    //this will print out an emtpy array
    System.out.println(Optional.of(resource.friends).orElse(new ArrayList<String>() {{add("Another John");}}));

Итак, что вам на самом деле нужно, это составить список друзей, чтобы вернуть необязательный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...