Comme indiqué précédemment , les concepteurs d'API ne supposent pas que le développeur souhaite traiter les nullvaleurs et les valeurs absentes de la même manière.
Si vous souhaitez toujours le faire, vous pouvez le faire explicitement en appliquant la séquence
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
au flux. Le résultat sera une option vide dans les deux cas, s'il n'y a pas de premier élément ou si le premier élément l'est null. Donc, dans votre cas, vous pouvez utiliser
String firstString = strings.stream()
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
.orElse(null);
pour obtenir une nullvaleur si le premier élément est absent ou null.
Si vous souhaitez faire la distinction entre ces cas, vous pouvez simplement omettre l' flatMapétape:
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"));
Ce n'est pas très différent de votre question mise à jour. Il suffit de remplacer "no such element"par "StringWhenListIsEmpty"et "first element is null"par null. Mais si vous n'aimez pas les conditions, vous pouvez également y parvenir comme:
String firstString = strings.stream().skip(0)
.map(Optional::ofNullable).findFirst()
.orElseGet(()->Optional.of("StringWhenListIsEmpty"))
.orElse(null);
Maintenant, ce firstStringsera nullsi un élément existe mais est nullet ce sera "StringWhenListIsEmpty"quand aucun élément n'existe.