import kotlin.jvm.functions.Function0;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.functions.Function2;

public class Java8Class {
    public void foo0(Function0<String> r) {
    }

    public void foo1(Function1<Integer, String> r) {
    }

    public void foo2(Function2<Integer, Integer, String> r) {
    }

    public void helper() {
    }

    public void foo() {
        foo0(() -> "42");
        foo0(() -> { return "42"; });
        foo0(() -> {
            helper();
            return "42";
        });

        foo1((i) -> "42");
        foo1(i -> { return "42"; });
        foo1((Integer i) -> {
            helper();
            if (i > 1) {
                return null;
            }

            return "43";
        });

        foo2((i, j) -> "42");
        foo2((Integer i, Integer j) -> {
            helper();
            return "42";
        });

        Function2<Integer, Integer, String> f = (Integer i, Integer k) -> {
            helper();
            if (i > 1) {
                return "42";
            }

            return "43";
        };

        Function2<Integer, Integer, String> f1 = (Integer i1, Integer k1) -> {
            Function2<Integer, Integer, String> f2 = (Integer i2, Integer k2) -> {
                helper();
                if (i2 > 1) {
                    return "42";
                }

                return "43";
            };
            if (i1 > 1) {
                return f.invoke(i1, k1);
            }
            return f.invoke(i1, k1);
        };

        Runnable runnable1 = () -> { };

        Runnable runnable2 = () -> {
            if (true) return;
            System.out.println("false");
        };

        foo1((Integer i) -> {
            if (i > 1) {
                return "42";
            }

            foo0(() -> {
                if (true) {
                    return "42";
                }
                return "43";
            });

            return "43";
        });
    }
}