×

Sự khác biệt giữa flatMap() và map() trong Stream API?

Trong Stream API của Java 8, map()flatMap() là hai phương thức trung gian (intermediate operations) được sử dụng rộng rãi, giúp thực hiện các thao tác biến đổi trên các phần tử của stream. Dù tương tự nhau ở mục đích biến đổi dữ liệu, chúng có những sự khác biệt quan trọng trong cách thức hoạt động và kết quả trả về.

map()

Phương thức map() được sử dụng để ánh xạ (transform) mỗi phần tử của stream sang một phần tử khác. Nói cách khác, cho mỗi phần tử của stream đầu vào, map() sẽ áp dụng một hàm (function) lên phần tử đó và trả về một phần tử mới cho stream đầu ra.

Ví dụ sử dụng map():

List<String> numberStrings = Arrays.asList("1", "2", "3");
List<Integer> numbers = numberStrings.stream()
                                     .map(Integer::parseInt) // Chuyển đổi từ String sang Integer
                                     .collect(Collectors.toList());

Trong ví dụ này, map() chuyển đổi từng String trong danh sách thành Integer.

flatMap()

Phương thức flatMap() cũng được sử dụng để biến đổi các phần tử, nhưng nó "làm phẳng" nhiều Stream của phần tử thành một Stream duy nhất. Điều này đặc biệt hữu ích khi mỗi phần tử của stream đầu vào được biến đổi thành một stream của phần tử, và bạn muốn tất cả các phần tử đó được kết hợp vào một stream đơn lẻ.

Ví dụ sử dụng flatMap():

List<List<String>> listOflists = Arrays.asList(
  Arrays.asList("a", "b"),
  Arrays.asList("c", "d")
);
List<String> flatList = listOflists.stream()
                                    .flatMap(Collection::stream) // Làm phẳng List<List<String>> thành List<String>
                                    .collect(Collectors.toList());

Trong ví dụ này, flatMap() chuyển List<List<String>> thành một List<String> duy nhất bằng cách kết hợp tất cả các phần tử từ mỗi danh sách con vào một stream duy nhất.

Sự Khác Biệt Chính

  • Kết quả trả về: map() ánh xạ từng phần tử sang một phần tử khác, trong khi flatMap() có thể làm phẳng nhiều Stream thành một Stream duy nhất.
  • Ứng dụng: Sử dụng map() khi bạn muốn biến đổi từng phần tử của stream một cách độc lập. Sử dụng flatMap() khi mỗi phần tử của stream đầu vào được ánh xạ sang một stream của các phần tử và bạn muốn tất cả các phần tử đó trong một stream duy nhất.

Cả hai phương thức này đều là công cụ mạnh mẽ trong Stream API, giúp thực hiện các thao tác biến đổi dữ liệu một cách linh hoạt và hiệu quả.

Comments