1. Mengumpulkan elemen

Akhirnya, kita sampai pada metode yang paling menarik di Streamkelas, yaitu collect()metode. Ini digunakan untuk berpindah dari aliran ke koleksi yang kita kenal — List<T>, Set<T>, Map<T, R>dan lainnya.

Metode collect()mengambil collectorobjek khusus sebagai argumen. Objek ini membaca semua data dari aliran, mengonversinya menjadi jenis koleksi tertentu, dan mengembalikannya. Dan kemudian metode pengumpulan itu sendiri mengembalikan koleksi ini.

Semua ini dilakukan dengan cara yang agak apik: collectortipe objeknya adalah Collector<T, A, R>. Seperti yang Anda lihat, ini memiliki tiga parameter tipe. Parameter tipe terakhir ( R) biasanya bertipe seperti List<T>. Ini berarti kompiler dapat menggunakan tipe ini untuk menentukan tipe pengembalian yang benar untuk collect()metode itu sendiri.

Saya harap Anda tidak terlalu bingung. Bagaimanapun, Anda tidak perlu membuat objek Kolektor sendiri. Objek siap pakai yang dikembalikan oleh metode statis kelas Collectorssudah cukup.

Kelas kolektor

Kelas Collectorsmemiliki beberapa metode statis yang mengembalikan objek kolektor siap pakai — sesuatu untuk setiap kesempatan. Di sini kita akan mempertimbangkan yang paling penting.

toList()
Objek yang mengubah aliran menjadi daftar ( List<T>)
toSet()
Objek yang mengubah aliran menjadi set ( Set<T>)
toMap()
Objek yang mengubah aliran menjadi peta ( Map<K, V>)
joining()
Menggabungkan elemen aliran menjadi string tunggal
mapping()
Mengubah elemen string menjadi aMap<K, V>
groupingBy()
Mengelompokkan elemen dan mengembalikanMap<K, V>

2. Mengubah aliran menjadi daftar

Berikut ini adalah contoh khas bekerja dengan aliran dan mengonversi hasilnya menjadi daftar

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 dari koleksi. Kemudian kami mendapat aliran baru dengan hanya mempertahankan string yang karakter pertamanya adalah huruf besar. Kemudian semua data dari aliran tersebut dikumpulkan menjadi sebuah koleksi, yang kemudian dikembalikan.



3. Mengubah aliran menjadi satu set

Berikut ini adalah contoh tipikal bekerja dengan aliran dan mengonversi hasilnya menjadi satu 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() );

Semuanya sangat mirip dengan kode untuk mengonversi aliran ke a List, hanya saja kami menggunakan objek kolektor yang berbeda, yang dikembalikan oleh toSet()metode tersebut.



4. Mengubah aliran menjadi peta

Tetapi mengubah aliran menjadi peta sedikit lebih sulit. Setiap entri dalam Peta terdiri dari dua elemen: kunci dan nilai. Kita perlu memikirkan bagaimana kita akan menentukan kunci dan nilai untuk setiap elemen dalam aliran.

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 terjadi di sini.

Di baris pertama, kami menggunakan map(...)untuk mengubah setiap string menjadi array string. Menggunakan metode split, kami membagi setiap string menjadi dua bagian.

Di baris kedua, kami meneruskan ke filter()metode hanya array yang berisi tepat dua elemen. String d==3dipecah menjadi array tiga elemen, yang tidak cocok dengan filter.

Dan terakhir, di baris terakhir, kami mengonversi aliran menjadi file Map<String, String>. Dua fungsi dilewatkan ke toMap()metode. Untuk setiap elemen aliran, fungsi pertama harus mengembalikan key , dan fungsi kedua mengembalikan value .

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



5. Mengubah aliran menjadi string

Objek kolektor lain yang menarik dikembalikan oleh Collectors.joining(). Itu mengubah semua elemen aliran menjadi Stringdan menggabungkannya menjadi satu string. 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(", ") );