← Tất cả bài viết

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 tra isPresent() — 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ùng orElse/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.