import java.util.function.IntFunction;
import java.util.function.IntPredicate;
import java.util.function.IntSupplier;
import java.util.function.IntUnaryOperator;
import java.util.function.Predicate;
import java.util.function.ToIntFunction;

public class VarianPrimitif {
    public static void main(String[] args) {
        // Versi generic: setiap test() mem-box int menjadi Integer
        Predicate<Integer> genapBoks = n -> n % 2 == 0;

        // Versi primitif: bekerja langsung pada int, tanpa boxing
        IntPredicate genapLangsung = n -> n % 2 == 0;

        System.out.println("Predicate<Integer> : " + genapBoks.test(8));
        System.out.println("IntPredicate       : " + genapLangsung.test(8));

        // Keluarga primitif lengkap: masuk, keluar, atau keduanya
        IntSupplier stokAwal = () -> 120;
        ToIntFunction<String> hitungKarakter = String::length;
        IntUnaryOperator potongHarga = harga -> harga - 10000;
        IntFunction<String> rupiah = nilai -> "Rp" + nilai;

        System.out.println("stok awal   : " + stokAwal.getAsInt());
        System.out.println("karakter    : " + hitungKarakter.applyAsInt("pemrograman"));
        System.out.println("harga akhir : " + rupiah.apply(potongHarga.applyAsInt(25000)));
    }
}
