Comme indiqué précédemment , les concepteurs d'API ne supposent pas que le développeur souhaite traiter les null
valeurs 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 null
valeur 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 firstString
sera null
si un élément existe mais est null
et ce sera "StringWhenListIsEmpty"
quand aucun élément n'existe.