Baru di Jawa 12: The Teeing Collector

Dalam artikel ini, kita akan melihat kolektor baru yang diperkenalkan di Jawa 12. Fitur baru ini tidak diumumkan di JEP resmi, karena itu adalah permintaan perubahan kecil dengan tajuk " Buat Kolektor, yang menggabungkan hasil dari dua kolektor lain ". Ini dirancang untuk menggabungkan hasil dari dua kolektor.


Semua menarik - di bawah potongan


Jika Anda masih tidak tahu apa itu kolektor
Kolektor adalah kelas khusus yang digunakan untuk mengubah aliran ke struktur data lain. Misalnya, dalam list :
 list = Stream.of(1,2,3).collect(Collectors.toList()); //     1, 2  3 

Ini adalah contoh yang tidak berguna, karena menciptakan aliran baru dan segera mengubahnya. Diperkirakan untuk menunjukkan penggunaan kolektor

Dokumentasi


Klik di sini untuk melihat Collectors#teeing . Menurut dokumentasi resmi:
"... mengembalikan seorang kolektor yang terdiri dari dua kolektor bawahan. Setiap elemen yang ditransfer ke kolektor yang dihasilkan diproses oleh kedua kolektor bawahan, dan kemudian hasilnya digabungkan menggunakan fungsi khusus yang menghubungkan mereka dengan hasil akhir. ”
Asli
"... mengembalikan Kolektor yang merupakan gabungan dari dua kolektor hilir. Setiap elemen yang diteruskan ke kolektor yang dihasilkan diproses oleh kedua kolektor hilir, kemudian hasilnya digabung menggunakan fungsi gabungan yang ditentukan ke dalam hasil akhir."
Header Metode:

 static <T, R1, R2, R> Collector<T, ?, R> teeing( Collector<? super T, ?, R1> downstream1, Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger) 

Fakta menarik


Ini adalah tee (teeing dari Bahasa Inggris):



Teeing datang dari tee. Menurut Wikipedia, "tee adalah fitting yang paling umum (menghubungkan bagian dari pipa, kira-kira. Penerjemah) yang digunakan untuk menggabungkan [atau membagi] aliran fluida (dalam hal ini, kami maksudkan stream, stream - stream / stream, comment translator)."
Nama lain diusulkan: membagi dua (membagi menjadi 2_parts), duplexing, membagi dua (membagi), replikator, fanout (membagi), mengetuk, membuka ritsleting, pengumpulan
Semua alternatif yang dinilai oleh pengembang Core dapat ditemukan di sini .

Contoh Penggunaan


Saya telah mengumpulkan tiga contoh penggunaan kode dengan berbagai tingkat kompleksitas.

Daftar tamu


Kami mengekstraksi dua jenis informasi berbeda dari daftar objek dalam aliran. Setiap tamu harus menerima undangan dan dapat memimpin keluarga. Kami ingin tahu siapa yang mengkonfirmasi reservasi dan jumlah peserta (termasuk tamu dan anggota keluarga).

 var result = Stream.of( // Guest(String name, boolean participating, Integer participantsNumber) new Guest("Marco", true, 3), new Guest("David", false, 2), new Guest("Roger",true, 6)) .collect(Collectors.teeing( //  ,    ,    Collectors.filtering(Guest::isParticipating, //        Collectors.mapping(o -> o.name, Collectors.toList())), //  ,       Collectors.summingInt(Guest::getParticipantsNumber), //      , //    EventParticipation::new )); System.out.println(result); //  // EventParticipation { guests = [Marco, Roger], // total number of participants = 11 } 


Tamu
 class Guest { private String name; private boolean participating; private Integer participantsNumber; public Guest(String name, boolean participating, Integer participantsNumber) { this.name = name; this.participating = participating; this.participantsNumber = participantsNumber; } public boolean isParticipating() { return participating; } public Integer getParticipantsNumber() { return participantsNumber; } } 


Partisipasi acara
 class EventParticipation { private List<String> guestNameList; private Integer totalNumberOfParticipants; public EventParticipation(List<String> guestNameList, Integer totalNumberOfParticipants) { this.guestNameList = guestNameList; this.totalNumberOfParticipants = totalNumberOfParticipants; } @Override public String toString() { return "EventParticipation { " + "guests = " + guestNameList + ", total number of participants = " + totalNumberOfParticipants + " }"; }} 


Saring nama dalam dua daftar berbeda


Dalam contoh ini, kami membagi aliran nama menjadi dua daftar sesuai dengan filter.

 var result = Stream.of("Devoxx", "Voxxed Days", "Code One", "Basel One", "Angular Connect") .collect(Collectors.teeing( //   Collectors.filtering(n -> n.contains("xx"), Collectors.toList()), //   Collectors.filtering(n -> n.endsWith("One"), Collectors.toList()), //  -       (List<String> list1, List<String> list2) -> List.of(list1, list2) )); System.out.println(result); // -> [[Devoxx, Voxxed Days], [Code One, Basel One]] 

Hitung dan tambahkan aliran angka


Anda mungkin telah melihat contoh serupa muncul di blog yang menggabungkan jumlah dan jumlah untuk mendapatkan rata-rata. Contoh ini tidak memerlukan Teeing , dan Anda cukup menggunakan AverageInt dan seorang kolektor sederhana.

Contoh berikut menggunakan fungsi dari Teeing untuk mengembalikan dua nilai:

 var result = Stream.of(5, 12, 19, 21) .collect(Collectors.teeing( //   Collectors.counting(), //   Collectors.summingInt(n -> Integer.valueOf(n.toString())), // : (count, sum) -> new Result(count, sum); Result::new )); System.out.println(result); // -> {count=4, sum=57} 

Hasil
 class Result { private Long count; private Integer sum; public Result(Long count, Integer sum) { this.count = count; this.sum = sum; } @Override public String toString() { return "{" + "count=" + count + ", sum=" + sum + '}'; }} 


Kemungkinan jebakan


Peta. Coba

Banyak contoh menggunakan Map.Entry untuk menyimpan hasil BiFunction . Tolong jangan lakukan ini karena Anda tidak dapat menyimpan argumen terakhir di Map . Tidak ada objek standar di Java Core untuk menyimpan dua nilai - Anda harus membuatnya sendiri.

Semua Tentang Java 12 Fitur Baru


Anda dapat menemukan informasi lebih lanjut dan fakta menarik tentang Java 12 dalam presentasi ini.

Koleksi yang berhasil!

Source: https://habr.com/ru/post/id445622/


All Articles