Wie bereits erwähnt , gehen die API-Designer nicht davon aus, dass der Entwickler null
Werte 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 null
Wert 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 firstString
wird es sein, null
wenn ein Element existiert, aber es ist null
und es wird sein, "StringWhenListIsEmpty"
wenn kein Element existiert.