Lớp Optional (giới thiệu Java 8) chứa giá trị non-null hoặc rỗng, giúp giảm NullPointerException. Java 9 bổ sung 3 phương thức: ifPresentOrElse(), or() và stream() – trong đó stream() chuyển Optional thành Stream (0 hoặc 1 phần tử).
Ví dụ minh họa
import java.util.Optional;
import java.util.stream.Stream;
public class OptionalTest {
public static void main(String args[]) {
getPerson().stream()
.map(Person::getName)
.map("Jai "::concat)
.forEach(System.out::println);
getEmptyPerson().stream()
.map(Person::getName)
.map("Jai "::concat)
.forEach(System.out::println);
}
private static Optional<Person> getEmptyPerson() {
return Optional.empty();
}
private static Optional<Person> getPerson() {
return Optional.of(new Person("Adithya"));
}
static class Person {
private String name;
public Person(String name) { this.name = name; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
}
Kết quả
Jai Adithya
Giải thích
getPerson()trả vềOptional.of("Adithya")→stream()tạo Stream 1 phần tử → pipeline xử lý in raJai Adithya.getEmptyPerson()trả vềOptional.empty()→stream()tạo Stream rỗng → pipeline không in gì.
Ứng dụng thực tế
Kết hợp Optional với Stream API để xử lý đồng nhất cả trường hợp có giá trị và không có giá trị, tránh kiểm tra isPresent() rối rắm:
// Trước Java 9
if (opt.isPresent()) {
process(opt.get());
}
// Java 9+
opt.stream().forEach(this::process);
Phương thức stream() làm cho Optional trở thành "first-class citizen" trong Stream pipeline.