Лямбда-выражение и опционально, как вернуть строковое значение - PullRequest
0 голосов
/ 07 ноября 2018

Я бы хотел получить необязательное значение, у меня есть что-то вроде этого:

Optional<String> value =

Optional.ofNullable(MyObject.getPeople())
    .ifPresent(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()));

person.getId () должен вернуть строку, я пробовал это, но это не сработало, получая несовместимые типы: void не может быть преобразован в java.util.Optional

Optional<String> value =

Optional.ofNullable(MyObject.getPeople())
    .ifPresent(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()))
        .orElse(null);

Есть идеи? Спасибо

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Если предположить, что люди имеют значение Collection, первое использование Optional не требуется. Вы можете сделать это так,

Optional<String> value = MyObject.getPeople().stream()
    .filter(person -> person.getName().equals("test1"))
    .findFirst().map(person -> person.getId());

Если существует значение, оно возвращает его, в противном случае оно возвращает пустое значение.

0 голосов
/ 07 ноября 2018

На самом деле вам не нужна вложенная лямбда для этого. Вместо этого верните Collections.emptyList() на orElse.

Optional<String> value = Optional.ofNullable(MyObject.getPeople())
            .orElse(Collections.emptyList())
            .stream()
            .filter(person -> person.getName().equals("test"))
            .findFirst()
            .map(Person::getId);
0 голосов
/ 07 ноября 2018

Optional.ifPresent занимает Consumer - поэтому вы не можете ничего с него вернуть. Используйте Optional.map.

Optional.ofNullable(MyObject.getPeople())
    .map(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()))
    .orElse(null);

Лучше было бы использовать flatmap и не возвращать ноль в конце (не рекомендуется присваивать null необязательной переменной)

Optional.ofNullable(MyObject.getPeople())
    .flatmap(people -> people                                                                    
        .stream()                                                                    
        .filter(person -> person.getName().equals("test1"))
        .findFirst()
        .map(person -> person.getId()));

Примечание: Ваше первое утверждение также немного странно. Если MyObject.getPeople возвращает коллекцию, то нет необходимости оборачивать ее необязательным (если только возвращаемое значение не может быть null - но, опять же, рекомендуется не возвращать null когда типом возврата является Коллекция).

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