1. Mengumpul elemen

Akhirnya, kami telah mencapai kaedah yang paling menarik dalam Streamkelas, collect()kaedah. Ia digunakan untuk beralih daripada strim ke koleksi biasa kami — List<T>, Set<T>, Map<T, R>dan lain-lain.

Kaedah collect()mengambil collectorobjek khas sebagai hujah. Objek ini membaca semua data daripada strim, menukarnya kepada jenis koleksi tertentu dan mengembalikannya. Dan kemudian kaedah pengumpulan itu sendiri mengembalikan koleksi ini.

Semua ini dilakukan dengan cara yang agak licik: collectorjenis objek ialah Collector<T, A, R>. Seperti yang anda lihat, ia mempunyai tiga jenis parameter. Parameter jenis terakhir ( R) biasanya jenis seperti List<T>. Ini bermakna pengkompil boleh menggunakan jenis ini untuk menentukan jenis pulangan yang betul untuk collect()kaedah itu sendiri.

Saya harap anda tidak terlalu keliru. Walau apa pun, anda tidak perlu membuat objek Pemungut sendiri. Objek siap yang dikembalikan oleh kaedah statik kelas Collectorsakan mencukupi.

Kelas pengumpul

Kelas Collectorsmempunyai beberapa kaedah statik yang mengembalikan objek pengumpul sedia - sesuatu untuk setiap kesempatan. Di sini kita akan mempertimbangkan yang paling penting.

toList()
Objek yang menukar aliran kepada senarai ( List<T>)
toSet()
Objek yang menukar aliran kepada set ( Set<T>)
toMap()
Objek yang menukar aliran kepada peta( Map<K, V>)
joining()
Menggabungkan elemen aliran menjadi satu rentetan
mapping()
Menukarkan unsur rentetan kepada aMap<K, V>
groupingBy()
Kumpulan elemen dan pulanganMap<K, V>

2. Menukar strim kepada senarai

Berikut ialah contoh biasa bekerja dengan strim dan menukar hasilnya kepada senarai

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() );

Kami mendapat aliran daripada koleksi. Kemudian kami mendapat aliran baharu dengan mengekalkan hanya rentetan yang aksara pertamanya ialah huruf besar. Kemudian semua data daripada aliran itu dikumpulkan ke dalam koleksi, yang kemudiannya dikembalikan.



3. Menukar aliran kepada set

Berikut ialah contoh biasa bekerja dengan aliran dan menukar hasilnya kepada set

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() );

Segala-galanya sangat serupa dengan kod untuk menukar aliran kepada List, hanya kami menggunakan objek pengumpul yang berbeza, yang dikembalikan oleh toSet()kaedah.



4. Menukar aliran kepada peta

Tetapi menukar aliran kepada peta adalah sedikit lebih sukar. Setiap entri dalam Peta terdiri daripada dua elemen: kunci dan nilai. Kita perlu memikirkan bagaimana kita akan menentukan kunci dan nilai untuk setiap elemen dalam strim.

Contoh:

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]) );

Mari kita lihat apa yang berlaku di sini.

Dalam baris pertama, kita gunakan map(...)untuk menukar setiap rentetan kepada tatasusunan rentetan. Menggunakan kaedah split, kami membahagi setiap rentetan kepada dua bahagian.

Dalam baris kedua, kami meneruskan kepada filter()kaedah hanya tatasusunan yang mengandungi dua elemen. Rentetan d==3terbahagi kepada tatasusunan tiga elemen, yang tidak sepadan dengan penapis.

Dan akhirnya, dalam baris terakhir, kami menukar aliran menjadi Map<String, String>. Dua fungsi dihantar ke toMap()kaedah. Untuk setiap elemen strim, fungsi pertama harus mengembalikan kunci , dan yang kedua mengembalikan nilai .

Elemen pertama setiap tatasusunan ("a", "b", "c") akan menjadi kunci kami, dan elemen kedua setiap tatasusunan ("2", "3", "4") akan menjadi nilai kami.



5. Menukar aliran kepada rentetan

Satu lagi objek pengumpul yang menarik dikembalikan oleh Collectors.joining(). Ia menukar semua elemen aliran kepada Stringdan menggabungkannya menjadi satu rentetan. Contoh

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