import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.BinaryOperator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;

public class KatalogBawaan {
    public static void main(String[] args) {
        // Empat interface dasar
        Predicate<String> kosong = String::isEmpty;            // T -> boolean
        Function<String, Integer> panjang = String::length;    // T -> R
        Consumer<String> cetak = System.out::println;          // T -> void
        Supplier<String> salam = () -> "Halo, pelanggan!";     // () -> T

        // Interface turunan dan versi dua-argumen
        UnaryOperator<String> kapital = String::toUpperCase;   // T -> T
        BinaryOperator<Integer> total = (a, b) -> a + b;       // (T, T) -> T
        BiPredicate<String, Integer> cocok = (teks, n) -> teks.length() == n;
        BiFunction<String, String, String> gabung = (a, b) -> a + " & " + b;
        BiConsumer<String, Integer> label = (nama, harga) ->
                System.out.println(nama + " Rp" + harga);

        System.out.println("teks kosong? " + kosong.test(""));
        System.out.println("panjang \"lambda\" = " + panjang.apply("lambda"));
        cetak.accept(salam.get());
        System.out.println(kapital.apply("deklaratif"));
        System.out.println("total = " + total.apply(40, 2));
        System.out.println("panjang cocok? " + cocok.test("budi", 4));
        System.out.println(gabung.apply("imperatif", "deklaratif"));
        label.accept("Kopi", 25000);
    }
}
