ตามที่ได้กล่าวไปแล้วนักออกแบบ API ไม่ถือว่าผู้พัฒนาต้องการรักษาnull
ค่าและค่าที่ขาดไปในลักษณะเดียวกัน
หากคุณยังต้องการทำเช่นนั้นคุณสามารถทำได้อย่างชัดเจนโดยใช้ลำดับ
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
ไปที่สตรีม null
ผลที่ตามมาจะเป็นตัวเลือกที่ว่างเปล่าในทั้งสองกรณีถ้ามีองค์ประกอบที่ไม่มีแรกหรือถ้าองค์ประกอบแรกคือ ดังนั้นในกรณีของคุณคุณอาจใช้
String firstString = strings.stream()
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
.orElse(null);
เพื่อรับnull
ค่าหากไม่มีองค์ประกอบแรกหรือnull
.
หากคุณต้องการแยกความแตกต่างระหว่างกรณีเหล่านี้คุณสามารถข้ามflatMap
ขั้นตอน:
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"));
คำถามนี้ไม่แตกต่างจากคำถามที่อัปเดตของคุณมากนัก คุณก็ต้องเปลี่ยน"no such element"
ด้วย"StringWhenListIsEmpty"
และมี"first element is null"
null
แต่ถ้าคุณไม่ชอบเงื่อนไขคุณสามารถทำได้เช่น:
String firstString = strings.stream().skip(0)
.map(Optional::ofNullable).findFirst()
.orElseGet(()->Optional.of("StringWhenListIsEmpty"))
.orElse(null);
ตอนนี้firstString
จะเป็นnull
ถ้าองค์ประกอบมีอยู่ แต่เป็นnull
และจะเป็น"StringWhenListIsEmpty"
เมื่อไม่มีองค์ประกอบ