Saltar al contenido

¿Por qué findFirst() lanza una NullPointerException si el primer elemento que encuentra es null?

Entiende el código de forma correcta previamente a usarlo a tu proyecto si tdeseas aportar algo puedes decirlo en los comentarios.

Solución:

La razón de esto es el uso de Optional en el regreso Opcional no está permitido contener null. Esencialmente, no ofrece forma de distinguir situaciones “no está ahí” y “está ahí, pero está configurado para null“.

Es por eso que la documentación prohíbe explícitamente la situación cuando null se selecciona en findFirst():

Lanza:

NullPointerException – si el elemento seleccionado es null

Como ya se discutió, los diseñadores de API no asumen que el desarrollador quiere tratar null valores y valores ausentes de la misma manera.

Si aún desea hacer eso, puede hacerlo explícitamente aplicando la secuencia

.map(Optional::ofNullable).findFirst().flatMap(Function.identity())

al arroyo El resultado será un opcional vacío en ambos casos, si no hay un primer elemento o si el primer elemento es null. Entonces, en su caso, puede usar

String firstString = strings.stream()
    .map(Optional::ofNullable).findFirst().flatMap(Function.identity())
    .orElse(null);

conseguir un null valor si el primer elemento está ausente o null.

Si desea distinguir entre estos casos, simplemente puede omitir el flatMap paso:

Optional firstString = strings.stream()
    .map(Optional::ofNullable).findFirst().orElse(null);
System.out.println(firstString==null? "no such element":
                   firstString.orElse("first element is null"));

Esto no es muy diferente a su pregunta actualizada. Solo tienes que reemplazar "no such element" con "StringWhenListIsEmpty" y "first element is null" con null. Pero si no te gustan los condicionales, también puedes lograrlo así:

String firstString = strings.stream().skip(0)
    .map(Optional::ofNullable).findFirst()
    .orElseGet(()->Optional.of("StringWhenListIsEmpty"))
    .orElse(null);

Ahora, firstString estarán null si un elemento existe pero es null y será "StringWhenListIsEmpty" cuando no existe ningún elemento.

Puedes usar java.util.Objects.nonNull para filtrar la lista antes de buscar

algo como

list.stream().filter(Objects::nonNull).findFirst();

Aquí puedes ver las reseñas y valoraciones de los usuarios

Si conservas alguna desconfianza y forma de ascender nuestro reseña te inspiramos ejecutar una anotación y con placer lo interpretaremos.

¡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 *