import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class KumpulkanHasil {

    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),
                new Produk("Air Mineral", "minuman", 8000)
        );

        // toList: menampung ke List (implementasi ArrayList)
        List<String> namaProduk = produk.stream()
                .map(Produk::nama)
                .collect(Collectors.toList());
        System.out.println("toList       : " + namaProduk);

        // toSet: duplikat kategori otomatis dibuang
        Set<String> kategori = produk.stream()
                .map(Produk::kategori)
                .collect(Collectors.toSet());
        System.out.println("toSet        : " + kategori.size() + " kategori unik");
        System.out.println("berisi minuman? " + kategori.contains("minuman"));

        // toCollection: kita yang memilih implementasi collection
        LinkedList<String> antrean = produk.stream()
                .filter(p -> p.harga() <= 50000)
                .map(Produk::nama)
                .collect(Collectors.toCollection(LinkedList::new));
        System.out.println("toCollection : " + antrean.getClass().getSimpleName() + " " + antrean);

        // joining: merangkai teks dengan pemisah, prefiks, dan sufiks
        String label = produk.stream()
                .filter(p -> p.kategori().equals("minuman"))
                .map(Produk::nama)
                .collect(Collectors.joining(", ", "[", "]"));
        System.out.println("joining      : " + label);
    }
}
