Daha önce tartışıldığı gibi, API tasarımcıları, geliştiricinin null
değ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);
null
ilk öğe yoksa bir değer almak için veya null
.
Bu durumları birbirinden ayırmak istiyorsanız, şu flatMap
adı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, firstString
olacak null
bir unsur var ama eğer null
ve öyle de olacak "StringWhenListIsEmpty"
hiçbir unsur var olduğunda.