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() và of(T value) cho đến những phương thức mạnh mẽ như map() và 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:
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:
Optional<String> optionalWithNonNullValue = Optional.of("Hello");
3. Optional.ofNullable(value)
Tạo ra đối tượng Optional từ giá trị có thể null:
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:
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:
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:
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:
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ị:
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ị:
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:
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:
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:
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:
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:
Optional<Integer> lengthOptional = optional.map(String::length);
12. flatMap(mappingFunction)
Giữ nguyên kiểu Optional sau ánh xạ:
Optional<String> resultOptional = originalOptional.flatMap(s -> Optional.of(s.toUpperCase()));
13. Optional.ofNullable(nullableObject)
Tạo Optional từ dữ liệu có thể null:
Optional<String> optional1 = Optional.ofNullable("some random String");
14. Optional.empty()
Tạo Optional rỗng:
Optional<String> emptyOptional = Optional.empty();
15. Optional.of()
Sử dụng khi chắc chắn giá trị không phải là null:
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