Jak już wspomniano , projektanci API nie zakładają, że programista chce traktować null
wartości i wartości nieobecne w ten sam sposób.
Jeśli nadal chcesz to zrobić, możesz to zrobić jawnie, stosując sekwencję
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
do strumienia. Wynik będzie pusty opcjonalny w obu przypadkach, jeśli nie ma pierwszego elementu lub jeśli pierwszy element jest null
. Więc w twoim przypadku możesz użyć
String firstString = strings.stream()
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
.orElse(null);
aby uzyskać null
wartość, jeśli pierwszy element jest nieobecny lub null
.
Jeśli chcesz rozróżnić te przypadki, możesz po prostu pominąć flatMap
krok:
Optional<String> firstString = strings.stream()
.map(Optional::ofNullable).findFirst().orElse(null);
System.out.println(firstString==null? "no such element":
firstString.orElse("first element is null"));
Nie różni się to zbytnio od zaktualizowanego pytania. Po prostu trzeba wymienić "no such element"
z "StringWhenListIsEmpty"
i "first element is null"
z null
. Ale jeśli nie lubisz warunków warunkowych, możesz to osiągnąć również w następujący sposób:
String firstString = strings.stream().skip(0)
.map(Optional::ofNullable).findFirst()
.orElseGet(()->Optional.of("StringWhenListIsEmpty"))
.orElse(null);
Teraz firstString
będzie, null
jeśli element istnieje, ale jest, null
i będzie, "StringWhenListIsEmpty"
gdy żaden element nie istnieje.