Daha önce tartışıldığı gibi, API tasarımcıları, geliştiricinin nulldeğerleri ve eksik değerleri aynı şekilde ele almak istediğini varsaymaz .
Yine de bunu yapmak istiyorsanız, sırayı uygulayarak bunu açıkça yapabilirsiniz.
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
akıntıya. İlk öğe yoksa veya ilk öğe ise, sonuç her iki durumda da boş bir isteğe bağlı olacaktır null. Yani sizin durumunuzda kullanabilirsiniz
String firstString = strings.stream()
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
.orElse(null);
nullilk öğe yoksa bir değer almak için veya null.
Bu durumları birbirinden ayırmak istiyorsanız, şu flatMapadımı atlayabilirsiniz :
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"));
Bu, güncellenmiş sorunuzdan çok farklı değil. Sadece değiştirmek zorunda "no such element"olan "StringWhenListIsEmpty"ve "first element is null"birlikte null. Ancak koşullu ifadelerden hoşlanmıyorsanız, şu şekilde de başarabilirsiniz:
String firstString = strings.stream().skip(0)
.map(Optional::ofNullable).findFirst()
.orElseGet(()->Optional.of("StringWhenListIsEmpty"))
.orElse(null);
Şimdi, firstStringolacak nullbir unsur var ama eğer nullve öyle de olacak "StringWhenListIsEmpty"hiçbir unsur var olduğunda.