'Optional.get ()' sem verificação 'isPresent ()'


88

Eu tenho o seguinte código de pesquisa em Java:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();

Desejava encontrar a coluna por nome e retornar a primeira encontrada.

Eu entendo que há um caso em que nada foi encontrado e deve ser processado, mas como?

É isso que quer com este juramento:

'Optional.get()' without 'isPresent()' check

?

Como consertar? Desejo voltar nullse nada for encontrado.

ATUALIZAR

Ok, ok, eu simplesmente não percebi, isso findFirst()retorna Optional.


2
Observe que você não deve usar $como um identificador em Java: JLS Sec 3.8 : "O sinal $ deve ser usado apenas em código-fonte gerado mecanicamente ou, raramente, para acessar nomes pré-existentes em sistemas legados."
Andy Turner,

Respostas:


179

Substitua get()por orElse(null).


1
Por quê? :) Por que orElsecomeça com "ou"?
escurece

15
Porque esse é o nome do método. E elseé uma palavra-chave.
Andy Turner

8
@Dims é apenas uma forma abreviada de getOrElse, deixando de fora o get. Com opcional, você normalmente deve usar em orElsevez de getporque getlançará uma exceção se o valor for nulo.
puhlen

4
@puhlen orElseGet()leva a Supplier<T>, enquanto que orElse()leva a T. Eles não são equivalentes.
bcsb1001

1
@ bcsb1001 não foi isso que ele tentou dizer, "getOrElse" é um nome que ele inventou para explicar o propósito orElse; não há referência orElseGetem seu comentário;)
Rorrim

22
...findFirst().orElse(null);

Retorna o valor se presente; caso contrário, retorna null. A documentação diz que o parâmetro passado pode ser null(o que é proibido orElseGete orElseThrow).


1
isso é parcialmente verdade. findFirst () tem a seguinte regra: "Quando não há ordem de encontro ele retorna qualquer elemento do Stream." -> então, se o seu filtro não retornar o elemento correspondente, findFirst () retornará o primeiro (exceto que o fluxo está vazio antes)
Fl0R1D3R

1

minha solução foi verificar desta forma

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}

0

O Optional foi criado para que o código pudesse, após todas essas décadas, finalmente começar a evitar o null.

Remova o .get (), retorne o próprio Optional e faça com que o código de chamada trate-o de maneira apropriada (da mesma forma que faria no caso de você estar retornando null).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.