Khác với phương thức flatMap() trong đối tượng Stream của Java hay phương thức flatMap() trong đối tượng Optional trong Java giúp chúng ta có thể thao tác với các đối tượng Stream hay Optional của những đối tượng đơn giản hơn, phương thức flatMap() của đối tượng Mono hay đối tượng Flux trong Project Reactor với tham số là một Function được sử dụng để thực thi function với các item mà đối tượng Publisher (Mono/Flux) emit ra. Các item này sẽ được process asynchronously, nghĩa là không đợi việc thực thi function cho item này xong thì mới thực thi function cho item kế tiếp. Kết quả sau khi thực thi function sẽ lại tiếp tục được emit ra bởi một Publisher mới, để tiếp tục thực hiện các thao tác khác trong stream event:
Các item màu xanh và vàng trong hình trên sau khi được process, kết quả sẽ được emit bởi một Publisher và nếu chúng ta có nhiều thao tác cần thực hiện với các item này, sẽ có nhiều Publisher cần sử dụng để emit các kết quả. Các thao tác này sẽ được thực hiện bất đồng bộ với nhau các bạn nhé!
Ví dụ như mình có một đối tượng Flux đơn giản như sau:
1 |
Flux<String> flux = Flux.just("Khanh", "Quan"); |
Sử dụng phương thức flatMap(), chúng ta có thể chuyển đổi data được emit ra từ đối tượng Flux trên từ kiểu dữ liệu là String sang kiểu dữ liệu Integer và kết quả này được emit bởi một đối tượng Mono khác đóng vai trò là một Publisher. Ví dụ như sau:
1 2 3 4 5 6 |
flux.flatMap(s -> Mono.just(s.length())) .map(value -> { System.out.println(value); return value; }) .subscribe(); |
Kết quả sau khi chuyển đổi từ String sang Integer sẽ được pass vào phương thức map() để in ra console giá trị như các bạn thấy!
Kết quả:
Phương thức flatMap() của đối tượng Mono cũng tương tự nha các bạn!