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


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


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


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")
}

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.