Objects.isNull กับ Optional.ofNullable [ซ้ำกัน]

Oct 21 2020

ฉันมีรหัสชิ้นนี้ที่ใช้ในการทดสอบ

if (Objects.isNull(o)) {
            return null;
        }
        return String.valueOf(o);   

และเมื่อฉันแทนที่โค้ดส่วนนี้ด้วย

Optional.ofNullable(String.valueOf(o)).orElse(null);

ฉันมีข้อผิดพลาดในการยืนยันนี้ในการทดสอบของฉัน:

Expecting: <"null">
to be equal to: <null>
but was not.

คำตอบ

2 ernest_k Oct 21 2020 at 17:12

Optional.ofNullable(String.valueOf(o))จะไม่เป็นตัวเลือกที่ว่างเปล่าเมื่อo == nullเพราะผลตอบแทนสตริงString.valueOf(null)"null"

การใช้ทางเลือกที่ถูกต้องมีดังนี้:

Optional.ofNullable(o).map(String::valueOf).orElse(null);

ที่ofNullable(null)จะทำให้เป็นทางเลือกว่างซึ่งทำให้orElse(null)ถูกเรียกใช้ในที่สุด

1 ShekharKhairnar Oct 21 2020 at 17:11

String.valueOf () คืนค่าเป็นStirng () ของอ็อบเจ็กต์ถ้าไม่ใช่ null หรือส่งคืนสตริง "null"

ตรงจากคลาส String:

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

นั่นหมายความว่าในการยืนยันของคุณคุณกำลังทดสอบ "null" เท่ากับ null ซึ่งจะล้มเหลว