Java - Teeing Collectors

Halo semua, para penyihir Java masa depan! ? Hari ini, kita akan melakukan perjalanan yang menarik ke dunia Teeing Collectors di Java. Jangan khawatir jika Anda masih baru di bidang pemrograman – saya akan menjadi pemandu yang ramah, dan kita akan melakukannya langkah demi langkah. Pada akhir tutorial ini, Anda akan kaget dengan apa yang dapat Anda lakukan dengan Java!

Java - Teeing Collectors

Apa Itu Teeing Collectors?

Sebelum kita melompat ke ujung, mari kita mulai dari dasar-dasar. Bayangkan Anda berada di restoran mewah, dan pelayan membawa teko dengan dua angsa. Itulah seperti Teeing Collector di Java – itu adalah cara untuk menyeburkan data Anda ke dua "gelas" (atau operasi) pada saat yang sama!

Dalam istilah Java, Teeing Collector memungkinkan Anda untuk menerapkan dua pengumpul independen ke input yang sama dan kemudian menggabungkan hasil mereka. Mirip dengan memiliki dua pembantu yang bekerja pada tugas yang sama tetapi fokus pada aspek yang berbeda, dan kemudian Anda menggabungkan pekerjaan mereka di akhir.

Metode Collectors.teeing()

Java memperkenalkan metode Collectors.teeing() di Java 12. Ini adalah bagian dari Stream API, yang merupakan alat yang kuat untuk memproses koleksi data. Mari kita pecahkan 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 khawatir dengan sintaks yang menakutkan ini! Mari kita pecahkan:

  • T: Tipe elemen input
  • R1: Tipe hasil pengumpul pertama
  • R2: Tipe hasil pengumpul kedua
  • R: Tipe hasil akhir

Metode ini mengambil tiga parameter:

  1. downstream1: Pengumpul pertama
  2. downstream2: Pengumpul kedua
  3. merger: Fungsi untuk menggabungkan hasil dari dua pengumpul

Sekarang, mari kita lihat contohnya dalam beberapa contoh!

Contoh 1: Menghitung Mean dan Count

Bayangkan Anda adalah seorang guru (seperti saya!) dan Anda ingin menghitung rata-rata nilai murid Anda serta menghitung berapa banyak murid yang Anda miliki. Berikut ini adalah cara kita melakukan hal ini dengan Teeing Collector:

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("Rata-rata: %.2f, Jumlah: %d", average, count)
)
);

System.out.println(result);
}
}

Mari kita pecahkan:

  1. Kita mulai dengan daftar nilai murid.
  2. Kita menggunakan scores.stream() untuk membuat aliran dari nilai ini.
  3. Kita menerapkan Collectors.teeing() dengan dua pengumpul:
  • Collectors.averagingInt(Integer::intValue) menghitung nilai rata-rata.
  • Collectors.counting() menghitung jumlah nilai.
  1. Fungsi penggabungan menggabungkan hasil ini menjadi string yang diformat.

Ketika Anda menjalankan ini, Anda akan melihat output seperti:

Rata-rata: 86.60, Jumlah: 5

Apakah itu keren? Dengan hanya beberapa baris kode, kita telah menghitung dua metrik berbeda dari data kita!

Contoh 2: Menemukan Nilai Terendah dan Tertinggi

Sekarang, bayangkan Anda ingin menemukan nilai terendah dan tertinggi di kelas Anda. Kita dapat melakukan hal ini dengan satu operasi aliran menggunakan Teeing Collector:

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 menggunakan daftar nilai yang sama.
  2. Pengumpul pertama kita, Collectors.minBy(Integer::compareTo), menemukan nilai minimum.
  3. Pengumpul kedua kita, Collectors.maxBy(Integer::compareTo), menemukan nilai maksimum.
  4. Fungsi penggabungan menggabungkan ini menjadi string yang diformat, menggunakan orElse(0) untuk menangani kasus di mana daftar mungkin kosong.

Menjalankan ini akan memberikan Anda:

Terendah: 78, Tertinggi: 92

Mengapa Menggunakan Teeing Collectors?

Anda mungkin bertanya-tanya, "Mengapa harus ribet ini? Tidak bisa kita lakukan operasi ini secara terpisah?" Ya, Anda tentu saja bisa! Tetapi Teeing Collectors menawarkan beberapa keuntungan:

  1. Kes efisiensi: Anda hanya perlu mengulangi data sekali, yang dapat memberikan peningkatan performa yang besar untuk dataset yang besar.
  2. Keterbacaan: Itu membuat kode Anda lebih ringkas dan lebih mudah dipahami dengan sekilas.
  3. Fleksibilitas: Anda dapat menggabungkan dua pengumpul apa pun dengan cara yang kreatif untuk mengatasi masalah yang kompleks.

Aplikasi Praktis

Teeing Collectors tidak hanya untuk contoh sederhana seperti ini. Mereka dapat sangat berguna dalam skenario dunia nyata:

  • Dalam aplikasi keuangan, Anda mungkin menggunakannya untuk menghitung total dan rata-rata transaksi dalam satu kali lewati.
  • Dalam analisis data, Anda dapat menggunakannya untuk menemukan median dan modus dataset secara bersamaan.
  • Dalam pengembangan game, Anda dapat melacak skor tertinggi dan jumlah pemain yang mencapainya.

Kesimpulan

Dan itu semua, teman-teman! Kita telah melakukan penyelaman mendalam ke dunia Teeing Collectors di Java. Kita telah melihat bagaimana mereka dapat membantu kita melakukan dua operasi sekaligus dan menggabungkan hasilnya, semua dalam satu operasi aliran yang efisien.

Ingat, pemrograman adalah tentang menyelesaikan masalah, dan Teeing Collectors adalah hanya alat lain dalam toolkit penyelesaian masalah Anda. Semakin banyak Anda berlatih dengan mereka, semakin banyak cara kreatif Anda akan menemukan untuk menggunakannya di proyek Anda sendiri.

Teruskan coding, teruskan belajar, dan yang paling penting, bersenang-senanglah dengan itu! Mana tahu? Mungkin suatu hari Anda juga akan mengajar Java, berbagi pengalaman dan lelucon buruk Anda dengan generasi baru pemrogrammer. Sampai jumpa berikutnya, happy coding! ??‍??‍?

Credits: Image by storyset