import java.util.function.BiFunction;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.UnaryOperator;

public class MesinTransformasi {
    public static void main(String[] args) {
        // Function dasar: satu masukan String, keluaran Integer
        Function<String, Integer> parser = Integer::parseInt;
        System.out.println(parser.apply("99"));

        // andThen: keluaran parser menjadi masukan lambda berikutnya
        Function<String, Integer> parserKaliDua = parser.andThen(n -> n * 2);
        System.out.println(parserKaliDua.apply("99"));

        // BiFunction: dua masukan, satu keluaran
        BiFunction<Integer, Integer, Integer> pangkat =
                (dasar, eksponen) -> (int) Math.pow(dasar, eksponen);
        System.out.println(pangkat.apply(2, 10));

        // UnaryOperator: masukan dan keluaran bertipe sama
        UnaryOperator<String> rapikan = s -> s.trim().toLowerCase();
        System.out.println("[" + rapikan.apply("  Halo Java  ") + "]");

        // BinaryOperator: dua masukan bertipe sama, keluaran bertipe sama
        BinaryOperator<String> gabung = (a, b) -> a + ", " + b;
        System.out.println(gabung.apply("imperatif", "deklaratif"));
    }
}
