Optional trong Java: dùng đúng và những lỗi thường gặp
22/07/2026
Optional<T> ra đời từ Java 8 để biểu diễn rõ ràng một giá trị có thể không tồn tại, giúp giảm NullPointerException. Nhưng lạm dụng Optional lại tạo ra code rối hơn.
Dùng đúng: giá trị trả về có thể vắng
Optional<User> findByEmail(String email);
// phía gọi xử lý rõ ràng
userRepo.findByEmail(email)
.map(User::getName)
.orElse("Khách");
Những lỗi thường gặp
- Gọi
get()mà không kiểm traisPresent()— ném exception, chẳng khác gì NPE - Dùng Optional làm tham số method — gây lời gọi rườm rà, nên nạp chồng method thay vì vậy
- Dùng Optional làm field của class/Entity — Optional không Serializable, không hợp lưu trữ
opt.isPresent() ? opt.get() : default— viết dài dòng, nên dùngorElse/orElseGet
orElse vs orElseGet
Khác biệt tinh tế nhưng quan trọng: orElse(x) luôn tính x kể cả khi có giá trị; orElseGet(() -> x) chỉ tính khi vắng. Nếu tạo giá trị mặc định tốn kém (query, tạo object), dùng orElseGet.
Quy tắc: Optional cho kiểu trả về, không cho tham số/field. Đừng bọc collection trong Optional — trả list rỗng thay vì Optional của list.
👉 Dùng thử công cụ liên quan trên dev-hub: JSON Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.