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