STACKJAVA

Optional class là gì? Optional Class trong Java 8

Optional class là gì? Optional Class trong Java 8

Optional Class trong Java 8

Optional Class là 1 tính năng mới trong được bổ sung trong Java 8
Optional
là 1 đối tượng generic, bản chất của Optional là một container (bao chứa) chứa đối tượng mà nó reference tới. Nó có thể rỗng hoặc chứa giá trị NULL (trường hợp đối tượng mà nó reference tới bị null). Cấu trúc này đảm bảo các biến được sử dụng thông qua Optional Class sẽ tránh được lỗi NullPointerException.

Ví dụ 1:

Mình có 1 method tìm đối tượng Person theo id findById

public class Person {
  private int id;
  private String name;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public static Person findById(int id) {
    //do something
    return ...;
  }
  public static void main(String[] args) {
    Person person = Person.findById(1);
    System.out.println(person.getName());
  }

}

Trường hợp trên có thể sẽ xảy ra lỗi NullPointerException nếu method findById trả về giá trị null, để khắc phục điểm này chúng ta phải kiểm tra null cho kết quả trả về từ method findById hoặc có thể dùng 1 Optional Class để xử lý như sau:

public static void main(String[] args) {
  Person person = Person.findById(1);
  
  // cách xử lý thông thường
  //if (person != null) {
  //	 System.out.println(person.getName());
  //}
  
  // cách xử lý với Optional Class

  // dùng ofNullable vì đối person có thể null
  Optional<Person> optionalPerson = Optional.ofNullable(person); 
  // ifPresent: kiểm tra đối tượng bên trong optional có khác null không
  optionalPerson.ifPresent(p -> System.out.println(p.getName())); 
}

Ví dụ 2:

import java.util.Optional;

public class DemoOptionClass {
  public static void main(String args[]) {
    Integer value1 = null;
    Integer value2 = new Integer(10);

    // Optional.ofNullable - cho phép truyền vào giá trị null.
    Optional<Integer> a = Optional.ofNullable(value1);

    // Optional.of - ném ra lỗi NullPointerException nếu giá trị truyền vào bằng null
    Optional<Integer> b = Optional.of(value2);
    System.out.println(sum(a, b));
  }

  public static Integer sum(Optional<Integer> a, Optional<Integer> b) {

    // Optional.orElse - trả về 1 giá trị khác, nếu giá trị trong optional class bằng null
    // Ở đây mình sẽ trả về 0 nếu giá trị trong option class a = null
    Integer value1 = a.orElse(new Integer(0));

    // Optional.get - trả về giá trị bên trong optional class
    Integer value2 = b.get();
    return value1 + value2;
  }
}

Kết quả:

10

 

Một số method hay dùng trong Option Class

 

Phương thức & mô tả
static <T> Optional<T> empty()
Trả về một Optional instance rỗng.
Optional<T> filter(Predicate<? super <T> predicate)
Nếu như có giá trị hiện diện trong đối tượng Optional này và giá trị của nó khớp với Predicate truyền vào, nó sẽ trả về một Optional chứa giá trị đó, mặc khác sẽ trả về một Optional rỗng.
T get()
Nếu như có giá trị trong Optional này, nó sẽ trả về giá trị đó, ngược lại sẽ ném ra NoSuchElementException nếu như đối tượng rỗng.
void ifPresent(Consumer<? super T> consumer) 
Nếu như đối tượng Optional đang chứa giá trị, nó sẽ áp dụng consumer được truyền vào cho giá trị của nó. Ngược lại thì không làm gì cả.
boolean isPresent()
Phương thức này được sử dụng để kiểm tra xem trong đối tượng Optional có đang chứa giá trị hay không. Giá trị trả về là True nếu có giá trị và ngược lại trả về false.
static <T> Optional<T> of(T value)
Trả về đối tượng Optional kiểu T chứa giá trị của value.
static <T> Optional<T> ofNullable(T value)
Trả về một Optional chứa giá trị được truyền vào nếu khác null, ngược lại sẽ trả về một Optional rỗng.
T orElse(T other)
Trả về giá trị của đối tượng Optional nếu có, ngược lại nó sẽ trả về đối tượng other mà bạn đã truyền vào phương thức này.
T orElseGet(Supplier<? extends T> other)
Trả về giá trị nếu tồn tại, ngược lại nó sẽ gọi other mà bạn đã truyền vào sau đó trả về kết quả của Supplier.
<X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
Nếu như đối tượng Optional có giá trị tồn tại thì nó sẽ trả về giá trị đó, ngược lại sẽ ném ra một Exception do chúng ta định nghĩa bởi Supplier đã truyền vào.

 

References:

https://www.tutorialspoint.com/java8/java8_optional_class.htm