0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Tìm Hiểu Optional trong Java: Làm Chủ 15 Phương Thức Quan Trọng Trong 20 Giây

Đăng vào 1 tháng trước

• 4 phút đọc

Chào mừng bạn đến với bài viết này! Trong không khí mùa xuân năm 2024, mình xin gửi tới các bạn lời chúc sức khỏe và thành công trong học tập và công việc! ♥️😘

Java 8 đã mang đến cho lập trình viên một công cụ mạnh mẽ mang tên Optional. Công cụ này giúp xử lý các giá trị có thể không tồn tại một cách linh hoạt và an toàn. Lợi ích lớn nhất của Optional là giảm thiểu rủi ro gặp phải NullPointerException, đồng thời làm cho mã nguồn trở nên dễ đọc hơn khi xử lý tình huống không có giá trị.

Trong bài viết này, chúng ta sẽ khám phá 15 phương thức quan trọng của Optional trong Java. Từ những phương thức cơ bản như empty()of(T value) cho đến những phương thức mạnh mẽ như map()filter(), mình sẽ cung cấp ví dụ minh họa để bạn hiểu rõ hơn về sức mạnh của Optional. Nếu bạn muốn trở thành một chuyên gia trong việc xử lý giá trị có thể không tồn tại, hãy cùng đồng hành với mình!

1. Tổng Quan Về Optional

Khái Niệm

Trong lập trình Java, Optional là một phần của gói java.util được giới thiệu từ phiên bản Java 8. Optional được thiết kế nhằm giải quyết vấn đề NullPointerException và làm cho việc xử lý giá trị có thể không tồn tại trở nên an toàn hơn.

Optional là một lớp bao bọc, cho phép bạn có hoặc không có giá trị. Nó có thể ở trạng thái:

  • present - nếu giá trị không phải là null;
  • empty - nếu nó bao bọc giá trị null.

2. Cách Khởi Tạo Optional

1. Optional.empty()
Phương thức này tạo ra một đối tượng Optional trống:

Copy
Optional<String> emptyOptional = Optional.empty();

2. Optional.of(T value)
Tạo ra một đối tượng Optional chứa giá trị không null:

Copy
Optional<String> optionalWithNonNullValue = Optional.of("Hello");

3. Optional.ofNullable(value)
Tạo ra đối tượng Optional từ giá trị có thể null:

Copy
String nullableString = getNullableString(); // Hàm này trả về một chuỗi có thể là null
Optional<String> optionalFromNullable = Optional.ofNullable(nullableString);

Lưu Ý Quan Trọng:

  • Sử dụng Optional.of chỉ khi chắc chắn rằng giá trị không phải là null để tránh NullPointerException.
  • Sử dụng Optional.ofNullable khi không chắc chắn về giá trị.
  • Sử dụng Optional.empty để rõ ràng trả về giá trị không tồn tại.

3. Khi Nào Nên và Không Nên Sử Dụng Optional

Mình đã trình bày chi tiết về điều này trong bài viết khác. Hai bài viết sẽ bổ trợ cho nhau giúp bạn nắm bắt kiến thức về Optional trong Java.

4. Làm Chủ 15 Phương Thức Của Optional

Giờ hãy bắt đầu khám phá 15 phương thức của Optional trong chưa đầy 20 giây nào! Chúng ta sẽ sử dụng lớp ColorsRepository để minh họa. Phương thức tĩnh getColor(String colorName) sẽ trả về một đối tượng Color gói trong Optional.
Ví dụ: ColorsRepository.getColor("red") sẽ trả về Optional chứa màu đỏ, còn ColorsRepository.getColor("spencer") sẽ trả về Optional trống.

1. isPresent()

Kiểm tra xem giá trị có tồn tại hay không:

Copy
Optional<Color> color = ColorsRepository.getColor("red");
if (color.isPresent()) {
    System.out.println("'red' color was found");
}

2. isEmpty()

Kiểm tra xem đối tượng có bao bọc giá trị null hay không:

Copy
Optional<Color> color = ColorsRepository.getColor("spencer");
if (color.isEmpty()) {
    System.out.println("'spencer' color was NOT found");
}

3. get()

Truy cập dữ liệu bên trong Optional:

Copy
Optional<Color> color1 = ColorsRepository.getColor("red");
System.out.println(color1.get()); // In ra đối tượng màu đỏ

Optional<Color> color2 = ColorsRepository.getColor("spencer");
System.out.println(color2.get()); // Ném ra NoSuchElementException

4. orElseThrow()

Giống như get(), nhưng ném NoSuchElementException nếu trống:

Copy
Optional<Color> color1 = ColorsRepository.getColor("red");
System.out.println(color1.orElseThrow());

5. orElseThrow(exceptionSupplier)

Ném ra một ngoại lệ tùy ý khi không có giá trị:

Copy
Optional<String> optional = Optional.empty();
try {
    String value = optional.orElseThrow(() -> new CustomException("Custom error message"));
} catch (CustomException e) {
    System.out.println("Caught an exception: " + e.getMessage());
}

6. orElse(defaultValue)

Trả về giá trị mặc định nếu không có giá trị:

Copy
Optional<Color> color1 = ColorsRepository.getColor("red");
System.out.println(color1.orElse(Color.WHITE));

7. orElseGet(defaultValueSupplier)

Tương tự nhưng giá trị sẽ được lấy thông qua Supplier:

Copy
Optional<Color> color1 = ColorsRepository.getColor("red");
System.out.println(color1.orElseGet(() -> new Color(150, 150, 200)));

8. ifPresent(consumer)

Thực hiện hành động nếu giá trị tồn tại:

Copy
Optional<Color> color1 = ColorsRepository.getColor("red");
color1.ifPresent(color -> System.out.println("color retrieved: " + color));

9. ifPresentOrElse(consumer, runnable)

Thực hiện hành động khác nếu giá trị không tồn tại:

Copy
optionalWithValue.ifPresentOrElse(value -> System.out.println("Value is present: " + value), () -> System.out.println("Value is not present"));

10. filter(filterPredicate)

Trả về Optional khác dựa trên Predicate:

Copy
Optional<String> filteredOptional = optional.filter(s -> s.length() > 3);

11. map(mappingFunction)

Ánh xạ giá trị từ một kiểu sang kiểu khác:

Copy
Optional<Integer> lengthOptional = optional.map(String::length);

12. flatMap(mappingFunction)

Giữ nguyên kiểu Optional sau ánh xạ:

Copy
Optional<String> resultOptional = originalOptional.flatMap(s -> Optional.of(s.toUpperCase()));

13. Optional.ofNullable(nullableObject)

Tạo Optional từ dữ liệu có thể null:

Copy
Optional<String> optional1 = Optional.ofNullable("some random String");

14. Optional.empty()

Tạo Optional rỗng:

Copy
Optional<String> emptyOptional = Optional.empty();

15. Optional.of()

Sử dụng khi chắc chắn giá trị không phải là null:

Copy
Optional<String> nonEmptyOptional = Optional.of("Hello");

*Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về Optional trong Java và cách áp dụng các phương thức của nó hiệu quả. Đừng quên thực hành để thành thạo hơn nhé! Chúc bạn thành công!

Tham khảo thêm các tài liệu hữu ích qua các liên kết bên dưới!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào