Collectors toMap trong Stream API

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu toMap() method của Collectors class. Nó được sử dụng để chuyển các phần tử của Stream sang Map instance.

Convert List to Map

Chuyển một List sang Map là một thao tác khá phổ biến mà chúng ta thường sử dụng khi cần nhóm các đối tượng trong List theo một Key xác định.

Giả sử chúng ta có Book class:

Khởi tạo một List danh sách các Book instance để kiểm tra các ví dụ bên dưới:

Lưu ý toMap() method có các overload method khác, tuy nhiên chúng ta sẽ sử dụng toMap() method sau:

Như vậy, từ toMap() method chúng ta phải nêu rõ chiến lược để lấy Key Value cho Map instance.

Kiếm tra kết quả

Output:

0395489318 – The Fellowship of the Ring
0618129111 – The Return of the King
0345339711 – The Two Towers

Duplicate key

Ví dụ ở trên chạy khá ổn, nhưng với trường hợp Key được chọn có nhiều hơn 1 thì sẽ gây ra IllegalStateException

Ví dụ chuyển List sang Map với Key là releaseYear. Với các Book instance mà chúng ta có thì có 2 Book có cùng giá trị releaseYear = 1954.

Output: Exception in thread “main” java.lang.IllegalStateException: Duplicate key [email protected]

Để giải quyết vấn đề trên, chúng ta cần một toMap() method xử lý khi 1 Key xuất hiện nhiều hơn 1 lần.

toMap() method trên cung cấp thêm một BinaryOperator functional interface cho phép chúng ta triển khai mã xử lý khi có trường hợp Duplicate Key.  

Sau đây là ví dụ, nếu có 2 Book instance có cùng Key, chúng ta sẽ lấy phần tử đã được thêm trước đó.

Output: 

1954 – The Fellowship of the Ring
1955 – The Return of the King

Change Return Type Map

Mặc định toMap() method trả về HashMap, 1 implement của Map interface. Tuy nhiên chúng ta có thể thay đổi sang các implement khác của Map interface với

Trong đó mapSupplier sẽ là function chỉ định một implement của Map interface được trả về bởi toMap().

Ví dụ sử dụng toMap() trả về một ConcurrentHashMap.

Tóm lược

Qua bài viết này, chúng ta đã biết cách chuyển một List sang Map với toMap() method. Nó sẽ rất hữu ích khi mà nhu cầu chuyển từ một List sang Map thường xuyên xảy ra.

Nguồn tham khảo

https://www.baeldung.com/java-collectors-tomap

Leave a Comment

Your email address will not be published. Required fields are marked *