Estou tentando entender o ifPresent()
método da Optional
API em Java 8.
Eu tenho uma lógica simples:
Optional<User> user=...
user.ifPresent(doSomethingWithUser(user.get()));
Mas isso resulta em um erro de compilação:
ifPresent(java.util.functionError:(186, 74) java: 'void' type not allowed here)
Claro que posso fazer algo assim:
if(user.isPresent())
{
doSomethingWithUser(user.get());
}
Mas isso é exatamente como um null
cheque desordenado .
Se eu mudar o código para este:
user.ifPresent(new Consumer<User>() {
@Override public void accept(User user) {
doSomethingWithUser(user.get());
}
});
O código está ficando mais sujo, o que me faz pensar em voltar ao null
cheque antigo .
Alguma ideia?
user.ifPresent(this::doSomethingWithUser);
Optional<User>
, geralmente não há necessidade de armazená-la em uma variável local. Apenas encadeie as chamadas de método:funcThatMightReturnUser().ifPresent(this::doSomethingWithUser);
Além da resposta de @JBNizet, meu caso de uso geral para
ifPresent
é combinar.isPresent()
e.get()
:À moda antiga:
Nova forma:
Isso, para mim, é mais intuitivo.
fonte
Use flatMap. Se um valor estiver presente, flatMap retorna um Stream sequencial contendo apenas aquele valor; caso contrário, retorna um Stream vazio. Portanto, não há necessidade de usar
ifPresent()
. Exemplo:fonte
Por que escrever um código complicado quando você pode torná-lo simples?
Na verdade, se você for absolutamente usar a
Optional
classe, o código mais simples é o que você já escreveu ...Este código tem a vantagem de ser
Só porque a Oracle adicionou a
Optional
classe em Java 8 não significa que essa classe deva ser usada em todas as situações.fonte
Você pode usar a referência de método como este:
O método
ifPresent()
getConsumer
object como um parâmetro e (de JavaDoc ): "Se um valor estiver presente, chame o consumidor especificado com o valor." Valor é a sua variáveluser
.Ou se este método
doSomethingWithUser
estiver naUser
classe e não estiverstatic
, você pode usar a referência de método desta forma:fonte
user.ifPresent(new ClassNameWhereMethodIs()::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
user.ifPresent(this::doSomethingWithUser);
. Vou adicioná-lo à minha resposta.