Java - Penyusun Teeing

Hai di sana, ahli Java yang akan datang! ? Hari ini, kita akan melakukan perjalanan yang menarik ke atas dunia Penyusun Teeing Java. Jangan khawatir jika anda baru dalam pemrograman – saya akan menjadi pemandu anda yang mesra, dan kita akan melakukannya langkah demi langkah. Pada akhir tutorial ini, anda akan kagum dengan apa yang anda boleh lakukan dengan Java!

Java - Teeing Collectors

Apa itu Penyusun Teeing?

Sebelum kita kembali ke dasar-dasar, mari kita mulakan dengan yang mudah. Bayangkan anda berada di atas restoran yang mewah, dan pelayan membawa atas rakit dengan dua rakun. Itu adalah jenis yang sama seperti Penyusun Teeing di atas Java – ia adalah cara untuk menuangkan data anda ke atas dua rakun yang berbeza ("cups" atau operasi) pada masa yang sama!

Dalam terma Java, Penyusun Teeing membenarkan anda untuk menerapkan dua penyusun bebas kepada input yang sama dan kemudian menggabungkan hasil mereka. Ia seperti memiliki dua penyedia bantuan yang bekerja pada tugas yang sama tetapi fokus kepada aspek yang berbeza, dan kemudian anda menggabungkan kerja mereka di akhir.

Method Collectors.teeing()

Java mengenalkan method Collectors.teeing() di atas Java 12. Ia adalah sebahagian daripada API Stream, yang merupakan alat yang kuat untuk memproses kumpulan data. Mari kita kongsi sintaksnya:

Sintaks

public 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)

Jangan biarkan sintaks yang kelihatan menakutkan ini menggentar anda! Mari kita kongsi sedikit:

  • T: jenis elemen input
  • R1: jenis hasil bagi penyusun pertama
  • R2: jenis hasil bagi penyusun kedua
  • R: jenis hasil akhir

Method ini mengambil tiga parameter:

  1. downstream1: penyusun pertama
  2. downstream2: penyusun kedua
  3. merger: fungsi untuk menggabungkan hasil dari dua penyusun

Sekarang, mari kita lihat ia beraksi dengan beberapa contoh!

Contoh 1: Mengira Purata dan Kiraan

Bayangkan anda adalah seorang guru (seperti saya!) dan anda mahu mengira purata mata pelajaran pelajar anda serta mengira berapa ramai pelajar anda ada. Ini cara kita boleh melakukan itu dengan Penyusun Teeing:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);

var result = scores.stream().collect(
Collectors.teeing(
Collectors.averagingInt(Integer::intValue),
Collectors.counting(),
(average, count) -> String.format("Purata: %.2f, Kiraan: %d", average, count)
)
);

System.out.println(result);
}
}

Mari kita kongsi ini:

  1. Kita mula dengan senarai mata pelajaran pelajar.
  2. Kita gunakan scores.stream() untuk membuat aliran bagi mata pelajaran ini.
  3. Kita terapkan Collectors.teeing() dengan dua penyusun:
  • Collectors.averagingInt(Integer::intValue) mengira purata mata pelajaran.
  • Collectors.counting() mengira jumlah mata pelajaran.
  1. Fungsi penggabungan menggabungkan hasil ini ke atas string yang diformat.

Apabila anda menjalankan ini, anda akan lihat output seperti:

Purata: 86.60, Kiraan: 5

Adakah itu yang kemas? Dengan hanya beberapa baris kod, kita telah mengira dua metrik yang berbeza dari data kita!

Contoh 2: Mengesan Markah Terendah dan Tertinggi

Sekarang, katakan anda mahu untuk mengesan kedua markah terendah dan tertinggi di atas kelas anda. Kita boleh melakukan itu dengan satu operasi aliran menggunakan Penyusun Teeing:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StudentScoreAnalyzer {
public static void main(String[] args) {
List<Integer> scores = Arrays.asList(85, 90, 78, 92, 88);

var result = scores.stream().collect(
Collectors.teeing(
Collectors.minBy(Integer::compareTo),
Collectors.maxBy(Integer::compareTo),
(min, max) -> String.format("Terendah: %d, Tertinggi: %d", min.orElse(0), max.orElse(0))
)
);

System.out.println(result);
}
}

Dalam contoh ini:

  1. Kita gunakan senarai mata pelajaran yang sama.
  2. Penyusun pertama kami, Collectors.minBy(Integer::compareTo), mengesan markah terendah.
  3. Penyusun kedua kami, Collectors.maxBy(Integer::compareTo), mengesan markah tertinggi.
  4. Fungsi penggabungan menggabungkan ini ke atas string yang diformat, menggunakan orElse(0) untuk mengendalikan kes dimana senarai mungkin kosong.

Menjalankan ini akan memberikan anda:

Terendah: 78, Tertinggi: 92

Mengapa Gunakan Penyusun Teeing?

Anda mungkin berfikir, "Mengapa perlu untuk melakukan semua kerja ini? Anda pasti boleh melakukan operasi ini secara berasingan!" Walau bagaimanapun, anda pasti boleh! Tetapi Penyusun Teeing menawarkan beberapa kelebihan:

  1. Ketekunan: Anda hanya perlu mengulangi data sekali, yang boleh memberikan peningkatan prestasi yang besar bagi dataset yang besar.
  2. Keterbacaan: Ia menjadikan kod anda lebih ringkas dan lebih mudah untuk dimengerti pada pandangan sekali.
  3. Kesederhanaan: Anda boleh menggabungkan mana-mana dua penyusun dengan cara yang kreatif untuk menjawab masalah yang kompleks.

Aplikasi Praktis

Penyusun Teeing bukan hanya untuk contoh ringkas seperti ini. Mereka boleh menjadi sangat berguna dalam senario dunia sebenar:

  • Dalam aplikasi kewangan, anda mungkin gunakan mereka untuk mengira jumlah dan purata transaksi dalam satu larian.
  • Dalam analisis data, anda boleh gunakan mereka untuk mengesan purata dan modus dataset secara serentak.
  • Dalam pengembangan permainan, anda boleh mengesan markah tertinggi dan jumlah pemain yang mencapai itu.

Penutup

Dan itu adalah, rakan-rakan! Kita telah melakukan kaji mendalam ke atas dunia Penyusun Teeing Java. Kita telah lihat bagaimana mereka boleh membantu kita melakukan dua operasi pada satu masa dan menggabungkan hasilnya, semua dalam satu operasi aliran yang efisien.

Ingat, pemrograman adalah tentang penyelesaian masalah, dan Penyusun Teeing adalah hanya satu alat lain dalam rak peralatan penyelesaian masalah anda. Semakin banyak anda berlatih dengan mereka, semakin banyak cara kreatif anda akan temui untuk menggunakannya dalam projek anda sendiri.

Terus untuk mengkod, terus untuk belajar, dan yang paling penting, bersenang-senanglah dengan itu! Siapa tahu? Mungkin suatu hari nanti anda akan mengajar Java juga, berbagi pengalaman anda dan lawak buruk dengan generasi baru pemrogram. Sampaijumpa lagi, coding yang gembira! ??‍??‍?

Credits: Image by storyset