ตามที่ได้กล่าวไปแล้วนักออกแบบ 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"เมื่อไม่มีองค์ประกอบ