'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.

Escurece
fonte
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).

Andy Turner
fonte
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).

Andrew Tobilko
fonte
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")
}
Yakup Ad
fonte
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).

Erwin Smout
fonte