Jak już wspomniano , projektanci API nie zakładają, że programista chce traktować nullwartoś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ć nullwartość, jeśli pierwszy element jest nieobecny lub null.
Jeśli chcesz rozróżnić te przypadki, możesz po prostu pominąć flatMapkrok:
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 firstStringbędzie, nulljeśli element istnieje, ale jest, nulli będzie, "StringWhenListIsEmpty"gdy żaden element nie istnieje.