import java.util.List;
import java.util.function.Predicate;

public class SaringLanjutan {

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

    // Kriteria bernama: mudah dibaca, diuji, dan dipakai ulang
    static boolean murah(Produk p) {
        return p.harga() <= 50000;
    }

    static List<String> namaSaja(List<Produk> sumber, Predicate<Produk> syarat) {
        return sumber.stream().filter(syarat).map(Produk::nama).toList();
    }

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

        Predicate<Produk> minuman = p -> p.kategori().equals("minuman");
        Predicate<Produk> hargaWajar = SaringLanjutan::murah;

        System.out.println("minuman dan murah     : " + namaSaja(produk, minuman.and(hargaWajar)));
        System.out.println("minuman atau murah    : " + namaSaja(produk, minuman.or(hargaWajar)));
        System.out.println("tidak murah           : " + namaSaja(produk, Predicate.not(SaringLanjutan::murah)));
    }
}
