Saltar al contenido

Java8: corriente findFirst resultado

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 NPEpero 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 ifPresentel 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *