Luego de de esta prolongada recopilación de datos solucionamos este atasco que presentan ciertos de nuestros usuarios. Te compartimos la solución y nuestro objetivo es servirte de mucha ayuda.
Solución:
Bueno, en cuanto a mí, la mejor manera es usar la programación funcional y seguir trabajando con opcional. Entonces, por ejemplo, si necesita pasar esto string a algún servicio, puedes hacer:
String fisrstString = myList.stream().findFirst().get();
service.doSomething(fisrstString);
Pero esto no se ve tan bien. En su lugar, puede utilizar las ventajas de la programación funcional y hacer:
myList.stream().findFirst().ifPresent(service::doSomething);
Primero no obtendrás un NPE
pero un NoSuchElementException
. Segundo, es Uds quién podría estar seguro; pero otras personas pueden venir y no darse cuenta de que será no lanzar una excepción.
Para un proyecto de sandbox: sí, no le importaría y puede ignorar la advertencia; para el código de producción, no lo deshabilitaría (incluso si pudiera).
Y el último punto es que si está tan seguro, ¿por qué no lanzar una excepción?
orElseThrow(IAmSureThisWillNotHappenException::new)
Debes hacer uso de la Optional
devuelto por findFirst()
en lugar de tratar de obtener su valor (si realmente está presente).
myList.stream()
.findFirst()
.ifPresent(/* consume the string here, if present */);
El Optional.ifPresent
método recibe un Consumer
que se utilizará sólo si el Optional
contiene un no-null valor.
El problema es que los desarrolladores de Java estamos tan acostumbrados al paradigma imperativo… En particular, estamos acostumbrados a obtener un objeto y emprendedor es decir, a un método:
String myString = "hello"; // getting an object here
System.out.println(myString); // pushing the object to System.out here
// (via the println method)
Con el Optional
devuelto por Stream.findFirst()
estabas haciendo lo mismo que arriba:
String myString = myList.stream()
.findFirst()
.get(); // getting a string here
System.out.println(myString); // pushing the string here
Por otro lado, el paradigma funcional (incluyendo Optional
) normalmente funciona al revés:
myList.stream()
.findFirst()
.ifPresent(myString -> System.out.println(myString));
Aquí, no obtienes el string y luego empujarlo a algún método. En su lugar, usted proporciona un argumento para Optional
‘s ifPresent
operación y dejar que la implementación de Optional
empuja el valor a tu argumento. En otras palabras, usted jalar el valor envuelto por el Optional
por medio de ifPresent
el argumento de ifPresent
entonces usará esto Consumer
argumento, sólo si el valor está presente.
Este patrón de extracción se ve mucho en la programación funcional y es muy útil, una vez que te acostumbras. Solo requiere que los desarrolladores comencemos a pensar (y programar) de una manera diferente.