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 kolektorKolektor adalah kelas khusus yang digunakan untuk mengubah aliran ke struktur data lain. Misalnya, dalam
list
:
list = Stream.of(1,2,3).collect(Collectors.toList());
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(
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(
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(
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!