Như các bạn đã biết, đối tượng Optional là một đối tượng Generic, kiểu dữ liệu của nó có thể là bất cứ đối tượng nào, và do đó, chúng ta có thể gặp trường hợp kiểu dữ liệu của nó cũng là một đối tượng Optional luôn, kiểu như: Optional<Optional<String>>. Để giải quyết vấn đề này, Java giới thiệu với chúng ta phương thức flatMap() trong đối tượng Optional để kiểu dữ liệu của Optional đơn giản hơn: ví dụ như Optional<String>.
Ví dụ, mình có phương thức sau:
1 2 3 4 |
public String findName() { // Do something return null; } |
Để hạn chế lỗi NPE, mình sẽ viết lại phương thức trên với đối tượng Optional:
1 2 3 4 |
public Optional<String> findName() { // Do something return Optional.empty(); } |
Bây giờ, nếu các bạn sử dụng phương thức trên với phương thức map() trong đối tượng Optional như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.huongdanjava.javaexample; import java.util.Optional; public class Example { public Optional<String> findName() { // Do something return Optional.empty(); } public static void main(String[] args) { Example e = new Example(); Optional<Example> opt = Optional.ofNullable(e); System.out.println(opt.map(x -> x.findName())); } } |
thì kiểu giá trị trả về của phương thức map() sẽ là:
Như các bạn thấy, ở đây kết quả trả về là một đối tượng Optional của đối tượng Optional.
Nếu bây giờ, mình sử dụng phương thức flatMap() thay thế cho phương thức map():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.huongdanjava.javaexample; import java.util.Optional; public class Example { public Optional<String> findName() { // Do something return Optional.empty(); } public static void main(String[] args) { Example e = new Example(); Optional<Example> opt = Optional.ofNullable(e); System.out.println(opt.flatMap(x -> x.findName())); } } |
thì kiểu giá trị trả về sẽ đơn giản hơn rất nhiều: