1. Thu thập các yếu tố

Cuối cùng, chúng ta đã đạt được phương thức thú vị nhất trong Streamlớp, collect()phương thức. Nó được sử dụng để di chuyển từ các luồng đến các bộ sưu tập quen thuộc của chúng tôi — List<T>, Set<T>, Map<T, R>và các bộ sưu tập khác.

Phương collect()thức lấy một collectorđối tượng đặc biệt làm đối số. Đối tượng này đọc tất cả dữ liệu từ luồng, chuyển đổi nó thành một loại bộ sưu tập cụ thể và trả về. Và sau đó, phương thức thu thập sẽ trả về bộ sưu tập này.

Tất cả điều này được thực hiện một cách khá khéo léo: collectorkiểu của đối tượng là Collector<T, A, R>. Như bạn có thể thấy, nó có ba loại tham số. Tham số kiểu cuối cùng ( R) thường là kiểu như List<T>. Điều này có nghĩa là trình biên dịch có thể sử dụng kiểu này để xác định kiểu trả về chính xác cho collect()chính phương thức đó.

Tôi hy vọng bạn không quá bối rối. Trong mọi trường hợp, bạn không cần phải tự tạo các đối tượng Collector. Các đối tượng làm sẵn được trả về bởi các phương thức tĩnh của Collectorslớp sẽ là đủ.

lớp sưu tập

Lớp này Collectorscó một số phương thức tĩnh trả về các đối tượng bộ sưu tập được tạo sẵn — một cái gì đó cho mọi trường hợp. Ở đây chúng tôi sẽ xem xét những cái quan trọng nhất.

toList()
Một đối tượng chuyển đổi luồng thành danh sách ( List<T>)
toSet()
Một đối tượng chuyển đổi một luồng thành một tập hợp ( Set<T>)
toMap()
Một đối tượng chuyển đổi luồng thành bản đồ( Map<K, V>)
joining()
Nối các phần tử của một luồng thành một chuỗi đơn
mapping()
Chuyển đổi các phần tử của một chuỗi thành mộtMap<K, V>
groupingBy()
Nhóm các phần tử và trả vềMap<K, V>

2. Chuyển đổi luồng thành danh sách

Sau đây là một ví dụ điển hình về cách làm việc với luồng và chuyển đổi kết quả thành danh sách

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

List<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toList() );

Chúng tôi có một luồng từ bộ sưu tập. Sau đó, chúng tôi có một luồng mới bằng cách chỉ giữ lại các chuỗi có ký tự đầu tiên là chữ hoa. Sau đó, tất cả dữ liệu từ luồng đó được thu thập vào một bộ sưu tập, bộ sưu tập này sau đó sẽ được trả về.



3. Chuyển đổi một luồng thành một tập hợp

Sau đây là một ví dụ điển hình về cách làm việc với luồng và chuyển đổi kết quả thành tập hợp

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Set<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toSet() );

Mọi thứ rất giống với mã để chuyển đổi luồng thành List, chỉ có điều chúng tôi sử dụng một đối tượng trình thu thập khác, đối tượng này được phương toSet()thức trả về.



4. Chuyển đổi luồng thành bản đồ

Nhưng chuyển đổi một luồng thành bản đồ thì khó hơn một chút. Mỗi mục trong Bản đồ bao gồm hai thành phần: khóa và giá trị. Chúng ta cần tìm ra cách chúng ta sẽ xác định khóa và giá trị cho từng phần tử trong luồng.

Ví dụ:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");

Map<String, String> result = list.stream()
   .map( e -> e.split("=") )
   .filter( e -> e.length == 2 )
   .collect( Collectors.toMap(e -> e[0], e -> e[1]) );

Chúng ta hãy xem những gì đang xảy ra ở đây.

Trong dòng đầu tiên, chúng tôi sử dụng map(...)để chuyển đổi từng chuỗi thành một chuỗi các chuỗi. Sử dụng phương pháp phân tách, chúng tôi chia mỗi chuỗi thành hai phần.

Trong dòng thứ hai, chúng ta filter()chỉ chuyển đến phương thức những mảng chứa chính xác hai phần tử. Chuỗi d==3được chia thành một mảng gồm ba phần tử, không khớp với bộ lọc.

Và cuối cùng, ở dòng cuối cùng, chúng tôi chuyển đổi luồng thành tệp Map<String, String>. Hai hàm được truyền cho toMap()phương thức. Đối với mỗi phần tử của luồng, hàm đầu tiên sẽ trả về khóahàm thứ hai trả về giá trị .

Phần tử đầu tiên của mỗi mảng ("a", "b", "c") sẽ là khóa của chúng tôi và phần tử thứ hai của mỗi mảng ("2", "3", "4") sẽ là giá trị của chúng tôi.



5. Chuyển đổi một luồng thành một chuỗi

Một đối tượng thu thập thú vị khác được trả về bởi Collectors.joining(). Nó chuyển đổi tất cả các phần tử của một luồng thành Stringvà nối chúng thành một chuỗi duy nhất. Ví dụ

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );