Я пытаюсь понять ifPresent()
метод Optional
API в Java 8.
У меня простая логика:
Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));
Но это приводит к ошибке компиляции:
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
Конечно, я могу сделать что-то вроде этого:
if(user.isPresent())
{
doSomethingWithUser(user.get());
}
Но это в точности как захламленный null
чек.
Если я изменю код на этот:
user.ifPresent(new Consumer<User>() {
@Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
Код становится грязнее, что заставляет меня думать о возвращении к старому null
чеку.
Любые идеи?
user.ifPresent(this::doSomethingWithUser);
Optional<User>
часто нет необходимости хранить ее в локальной переменной. Просто объедините вызовы методов в цепочку:funcThatMightReturnUser().ifPresent(this::doSomethingWithUser);
В дополнение к ответу @JBNizet мой общий вариант использования
ifPresent
- это объединить.isPresent()
и.get()
:Старый способ:
Optional opt = getIntOptional(); if(opt.isPresent()) { Integer value = opt.get(); // do something with value }
Новый способ:
Optional opt = getIntOptional(); opt.ifPresent(value -> { // do something with value })
Для меня это более интуитивно понятно.
источник
Зачем писать сложный код, если можно сделать его простым?
В самом деле, если вы абсолютно собираетесь использовать
Optional
класс, то самый простой код - это то, что вы уже написали ...if (user.isPresent()) { doSomethingWithUser(user.get()); }
Этот код имеет то преимущество, что он
Тот
Optional
факт, что Oracle добавил этот класс в Java 8, не означает, что этот класс необходимо использовать во всех ситуациях.источник
Используйте flatMap. Если значение присутствует, flatMap возвращает последовательный Stream, содержащий только это значение, в противном случае возвращает пустой Stream. Так что в использовании нет необходимости
ifPresent()
. Пример:list.stream().map(data -> data.getSomeValue).map(this::getOptinalValue).flatMap(Optional::stream).collect(Collectors.toList());
источник
Вы можете использовать ссылку на метод следующим образом:
Метод
ifPresent()
получаетConsumer
объект в качестве параметра и (из JavaDoc ): «Если значение присутствует, вызвать указанного потребителя со значением». Значение - это ваша переменнаяuser
.Или, если этот метод
doSomethingWithUser
находится вUser
классе, а его нетstatic
, вы можете использовать ссылку на метод следующим образом:user.ifPresent(this::doSomethingWithUser);
источник
user.ifPresent(new ClassNameWhereMethodIs()::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
. Я добавлю это к своему ответу.