Как передать метод как параметр java

Аватар пользователя Сергей Якимович
Сергей Якимович
21 декабря 2022

Передать метод в качестве параметра можно разными способами. Рассмотрим некоторые из них.

1) Воспользуемся готовым функциональным интерфейсом UnaryOperator :

    public static void superMethod(UnaryOperator<String> method) {
        String str = "Hexlet";
        String result = method.apply(str);
        System.out.println(result);
    }

// вызов с передачей методов
public class App {
    public static void main(String[] args) throws Exception {
        // передадим стандартный метод
        superMethod(String::toUpperCase); // => HEXLET
        // передадим лямбда-функцию
        superMethod(s -> s + "!"); // => hexlet!
        // передадим собственный метод
        superMethod(App::reverse);  // => telxeh
    }

    public static String reverse(String str) {
        StringBuilder builder = new StringBuilder();
        builder.append(str);
        return builder.reverse().toString();
    }
}

2) Создадим собственный интерфейс и передадим объект этого типа в нашу функцию :

    interface MyInterface {
        int count(int a, int b, int c);
    }

    public static void superMethodInterface(MyInterface method) {
        int a = 5, b = 10, c = 20;
        int result = method.count(a, b, c);
        System.out.println(result);
    }

// вызов с передачей методов
public class App {
    public static void main(String[] args) throws Exception {
        MyInterface count = new MyInterface() {
            @Override
            public int count(int a, int b, int c) {
                return a + b + c;
            }
        };
        superMethodInterface(count); // => 35
        superMethodInterface((a,b,c) -> a * b * c); // => 1000
        superMethodInterface((a,b,c) -> a + b - c); // => -5
    }

3) Получим метод с помощью рефлексии и передадим его :

    public static void superMethodReflection(Object object, Method method) throws Exception {
        int a = 10;
        int b = 20;
        int result = (int) method.invoke(object, a, b);
        System.out.println(result);
    }
// вызов с передачей методов
public class App {
    public static void main(String[] args) throws Exception {
        // передадим стандартный метод
        Method method = Integer.class.getDeclaredMethod("max", int.class, int.class);
        superMethodReflection(0, method); // => 20
        method = Integer.class.getDeclaredMethod("sum", int.class, int.class);
        superMethodReflection(0, method); // => 30
        // передадим собственный метод
        method = App.class.getDeclaredMethod("concate", int.class, int.class);
        superMethodReflection(new App(), method); // => 1020
    }

    public static int concate(int a, int b) {
        return Integer.parseInt("" + a + b);
    }
}
0 0