Wie bereits erwähnt , gehen die API-Designer nicht davon aus, dass der Entwickler nullWerte und fehlende Werte gleich behandeln möchte .
Wenn Sie dies dennoch tun möchten, können Sie dies explizit tun, indem Sie die Sequenz anwenden
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
zum Strom. Das Ergebnis ist in beiden Fällen leer, wenn kein erstes Element vorhanden ist oder wenn das erste Element vorhanden ist null. In Ihrem Fall können Sie also verwenden
String firstString = strings.stream()
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
.orElse(null);
um einen nullWert zu erhalten , wenn das erste Element fehlt oder null.
Wenn Sie zwischen diesen Fällen unterscheiden möchten, können Sie das einfach weglassen flatMap Schritt :
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"));
Dies unterscheidet sich nicht wesentlich von Ihrer aktualisierten Frage. Sie müssen nur "no such element"mit "StringWhenListIsEmpty"und "first element is null"mit ersetzennull . Aber wenn Sie Bedingungen nicht mögen, können Sie es auch erreichen wie:
String firstString = strings.stream().skip(0)
.map(Optional::ofNullable).findFirst()
.orElseGet(()->Optional.of("StringWhenListIsEmpty"))
.orElse(null);
Nun firstStringwird es sein, nullwenn ein Element existiert, aber es ist nullund es wird sein, "StringWhenListIsEmpty"wenn kein Element existiert.