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

Java 8 đã giới thiệu một lớp mới là Optional trong package java.util. Nó được sử dụng để đại diện cho một giá trị có mặt hoặc vắng mặt. Lợi ích chính của cấu trúc mới này là Không có quá nhiều kiểm tra null và tránh bất kỳ NullPointerExceptions xảy ra trong runtime. Do dó Optional hỗ trợ phát triển các API hoặc ứng dụng Java gọn gàng. Giống Collections và arrays, nó cũng là một Container để chứa tối đa một giá trị. Chúng ta hãy cùng khám phá cấu trúc mới này bằng một số ví dụ hữu ích sau đây.

Optional là gì?

Optional trong Java 8 là một Container object, nó bao bọc (warpper) một object, object này có thể present hoặc không. Khi object là null thì Optional trả về empty. Đặc biệt Optional hỗ trợ lambda expression.

Construction của Optional

  • Optional<String> empty = Optional.empty(); Empty Optional.
  • Optional<String> full = Optional.of("Framgia"); Not null Optional

Khi bạn không chắc tham số của nó có null hay không thì sử dụng method ofNullable()

  • Optional<String> halfFull = Optional.ofNullable(someOtherString);

Một số phương thức của Optional<T>

  • static <T> Optional<T> empty() : Trả về một Optional instance rỗng.
  • 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 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.
  •  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.
  • <U>Optional<U> map(Function<? super T,? extends U> mapper) : Nếu như có giá trị nó sẽ áp dụng Function lên giá trị đó và nếu kết quả sau khi áp dụng Function khác null thì nó sẽ trả về một Optional chứa giá trị của kết quả sau khi áp dụng Function.
  • <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper) : Nếu như có giá trị hiện diện trong Optional, nó sẽ áp dụng Function được truyền vào cho nó và trả về một Optional với kiểu U, ngược lại thì sẽ return về một empty Optional.
  • 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.
  • <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.

Ví dụ về Optional Java

Java8Tester.java

import java.util.Optional; public class Java8Tester { public static void main(String args[]) { Java8Tester java8Tester = new Java8Tester(); Integer value1 = null; Integer value2 = new Integer(10); //Optional.ofNullable - allows passed parameter to be null. Optional<Integer> a = Optional.ofNullable(value1); //Optional.of - throws NullPointerException if passed parameter is null Optional<Integer> b = Optional.of(value2); System.out.println(java8Tester.sum(a,b)); } public Integer sum(Optional<Integer> a, Optional<Integer> b) { //Optional.isPresent - checks the value is present or not System.out.println("First parameter is present: " + a.isPresent()); System.out.println("Second parameter is present: " + b.isPresent()); //Optional.orElse - returns the value if present otherwise returns //the default value passed. Integer value1 = a.orElse(new Integer(0)); //Optional.get - gets the value, value should be present Integer value2 = b.get(); return value1 + value2; } }
Code language: JavaScript (javascript)

Output:

First parameter is present: false Second parameter is present: true 10
Code language: JavaScript (javascript)

Tóm lại, Optional là một tính năng mới rất tiện lợi trong Java 8, được tạo riêng để quản lý các giá trị còn thiếu. Nó là một lớp bao bọc chứa một thể hiện của lớp đã có giá trị hoặc một giá trị null. Do đó, có thể thao tác các giá trị null như thể chúng là các thể hiện bình thường mà không nhất thiết phải thực hiện kiểm tra null ở mỗi bước.

Sử dụng Optional giúp chúng ta giảm bớt được các câu lệnh if-else không cần thiết, tránh lỗi Null Pointer Exception, nói cho người sử dụng biết là một value liệu có thể null hay không.

Bài viết liên quan

Leave a Reply

Your email address will not be published.