'Optional.get ()' sin la verificación 'isPresent ()'

88

Tengo el siguiente código de búsqueda en Java:

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

Quería encontrar la columna por nombre y devolver la primera que se encuentre.

Entiendo que hay un caso en el que no se encuentra nada y debe procesarse, pero ¿cómo?

¿Es esto lo que quiere con este juramento?

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

?

¿Como arreglar? Deseo volver nullsi no encuentro nada.

ACTUALIZAR

Está bien, está bien, simplemente no me di cuenta, eso findFirst()vuelve Optional.

Atenúa
fuente
2
Tenga en cuenta que no debe usar $como identificador en Java: JLS Sec 3.8 : "El signo $ debe usarse solo en código fuente generado mecánicamente o, raramente, para acceder a nombres preexistentes en sistemas heredados".
Andy Turner

Respuestas:

179

Reemplazar get()con orElse(null).

Andy Turner
fuente
1
¿Por qué? :) ¿Por qué orElseempieza con "o"?
Atenúa el
15
Porque ese es el nombre del método. Y elsees una palabra clave.
Andy Turner
8
@Dims es solo una forma corta de getOrElse, simplemente omitiendo el get. Con opcional, normalmente debería usar en orElselugar de getporque getlanzará una excepción si el valor es nulo.
puhlen
4
@puhlen orElseGet()toma a Supplier<T>, mientras que orElse()toma a T. Estos no son equivalentes.
bcsb1001
1
@ bcsb1001 eso no es lo que intentó decir, "getOrElse" es un nombre que inventó para explicar el propósito orElse; no hay ninguna referencia orElseGeten su comentario;)
Rorrim
22
...findFirst().orElse(null);

Devuelve el valor si está presente; de ​​lo contrario, devuelve null. La documentación dice que el parámetro pasado puede ser null(lo que está prohibido orElseGety orElseThrow).

Andrew Tobilko
fuente
1
eso es parcialmente cierto. findFirst () tiene la siguiente regla: "Cuando no hay un orden de encuentro, devuelve cualquier elemento del Stream". -> entonces, si su filtro no devuelve el elemento coincidente, findFirst () devolverá el primero (excepto que la secuencia está vacía de antemano)
Fl0R1D3R
1

mi solución fue comprobarlo de esta manera

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}
Anuncio de Yakup
fuente
0

Se creó Optional para que el código pudiera, después de todas estas décadas, finalmente comenzar a evitar null.

Elimine el .get (), devuelva el Opcional en sí y haga que el código de llamada se ocupe de él de manera adecuada (tal como debería hacerlo en el caso de que devuelva nulo).

Erwin Smout
fuente