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

public class HargaProduk {

    record Produk(String nama, String kategori, int harga) {}

    public static void main(String[] args) {
        List<Produk> etalase = List.of(
            new Produk("Pena", "alat tulis", 2000),
            new Produk("Pensil", "alat tulis", 1500),
            new Produk("Pena", "alat tulis", 2500),
            new Produk("Bag", "tas", 75000)
        );

        // toMap dengan merge function: kunci ganda diselesaikan, bukan error
        Map<String, Integer> hargaTermurah = etalase.stream()
            .collect(Collectors.toMap(
                Produk::nama,
                Produk::harga,
                (hargaLama, hargaBaru) -> Math.min(hargaLama, hargaBaru)));
        System.out.println("Harga termurah per nama: " + hargaTermurah);

        // mapping sebagai downstream collector pada groupingBy
        Map<String, List<String>> namaPerKategori = etalase.stream()
            .collect(Collectors.groupingBy(
                Produk::kategori,
                Collectors.mapping(Produk::nama, Collectors.toList())));
        System.out.println("Nama per kategori: " + namaPerKategori);

        // teeing: dua collector berjalan pada stream yang sama lalu hasilnya digabung
        String ringkasan = etalase.stream().collect(Collectors.teeing(
            Collectors.counting(),
            Collectors.summingInt(Produk::harga),
            (jumlah, total) -> jumlah + " produk dengan total harga " + total));
        System.out.println(ringkasan);
    }
}
