Sự khác biệt về khái niệm giữa việc chọn cái khác được giải thích trong tài liệu của họ. Nó dựa trên cách tiếp cận của một người tiêu dùng API để chọn một trong số họ được cho là được sử dụng hiệu quả bởi họ.
Optional
là đối tượng chứa có thể chứa hoặc không chứa giá trị không null.
Biến có loại là Optional
không bao giờ nên là null
; nó phải luôn trỏ đến một phiên bản Optional
.
Đây là lớp dựa trên giá trị; sử dụng các hoạt động nhạy cảm với danh tính (bao gồm cả bình đẳng tham chiếu (==), mã băm nhận dạng, hoặc đồng bộ) trên các trường hợp Tùy chọn có thể có kết quả không thể đoán trước và cần tránh.
ofNullable
trả về một Optional
với giá trị hiện tại nếu giá trị quy định là không null, nếu không một trống Optional
orElse
trả về giá trị nếu hiện tại nếu không, trả về khác.
Do đó các hành vi sau đây:
String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"
giống như nó đi qua
String foo = null, bar = null;
=> Optional.ofNullable(foo).orElse(bar);
=> Optional.ofNullable(null).orElse(bar);
=> Optional.empty().orElse(bar)
=> return otherwise 'bar'
=> returns null
Objects
là một lớp học bao gồm phương pháp hữu ích tĩnh cho hoạt động trên 01 Các đối tượnghoặc kiểm tra các điều kiện nhất định trước khi vận hành.
Những tiện ích này bao gồm các phương pháp null-an toàn hoặc null-tolerant cho tính mã băm của một đối tượng, trả lại một chuỗi cho một đối tượng , so sánh hai đối tượng, và kiểm tra nếu chỉ số hoặc tiểu tầm Giá trị vượt quá giới hạn.
Do đó sự khác biệt trong hành vi:
String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");
đó tiếp tục đánh giá nội bộ nếu requireNonNull("nonNull", "defaultObj")
và sau đó
=> returns "nonNull" since its a non-null value
bây giờ vì nó đi qua
String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);
Nó kiểm tra nội bộ nếu requireNonNull(bar, "defaultObj")
mà sau đó
=> throws a NullPointerException
Như ghi nhận cũng
throws NullPointerException
- nếu cả hai obj là null
và defaultObj là null
Ngoài ra còn có sự khác biệt không có chức năng nhỏ rằng 'phiên bản Optional' tạo ra rác * (trừ khi JIT đủ thông minh để tối ưu hóa nó đi) *. – Andreas
@Andreas JMH báo cáo không có sự khác biệt phân bổ giữa 'Optional.ofNullable(). OrElse()' và 'Objects.requireNonNullElse()' – ZhekaKozlov
@ZhekaKozlov Chỉ khi 'foo' là' null', trong trường hợp này 'ofNullable() 'trả về trường hợp * rỗng trống *. Bạn đã thử JMH với một 'null' không null? Bởi vì tôi đã lấy câu hỏi như yêu cầu sự khác biệt chức năng là gì giữa hai cho * bất kỳ * giá trị, không chỉ là giá trị 'null'. – Andreas