import java.util.List;

public class AgregasiHarga {

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

    public static void main(String[] args) {
        List<Produk> produk = List.of(
                new Produk("Kopi Arabika", "minuman", 85000),
                new Produk("Teh Hijau", "minuman", 45000),
                new Produk("Roti Gandum", "makanan", 30000),
                new Produk("Madu Hutan", "makanan", 120000)
        );

        // reduce(identity, accumulator): identitas 0 netral bagi penjumlahan
        int total = produk.stream()
                .map(Produk::harga)
                .reduce(0, (a, b) -> a + b);
        System.out.println("Total    : " + total);

        // Identitas yang SALAH: 1 bukan elemen netral penjumlahan
        int keliru = produk.stream()
                .map(Produk::harga)
                .reduce(1, (a, b) -> a + b);
        System.out.println("Keliru   : " + keliru + " (tergeser +1)");

        // Nilai terbesar dengan reduce tanpa identitas -> Optional
        int termahal = produk.stream()
                .map(Produk::harga)
                .reduce(Integer::max)
                .orElse(0);
        System.out.println("Termahal : " + termahal);

        // Concat teks: identitas "" netral bagi penggabungan
        String gabungan = produk.stream()
                .map(Produk::nama)
                .reduce((a, b) -> a + " + " + b)
                .orElse("(tidak ada produk)");
        System.out.println("Gabungan : " + gabungan);
    }
}
