Как в Java передать метод в качестве параметра
Рассмотрим такой пример. У нас есть два класса, каждый из которых содержит по одному методу:
class Dog {
public void eat(String food) {
System.out.println("Dog is eating " + food);
}
}
class Cat {
public void play(String item) {
System.out.println("Cat is playing with " + item);
}
}
Очевидно, что сигнатуры методов eat и play идентичны: оба метода принимают по одному строковому параметру и не возвращают значений.
Для таких методов можно написать функциональный интерфейс. Например, такой:
@FunctionalInterface
interface Activity {
void interactWith(String mean);
}
Единственный метод данного интерфейса также полностью аналогичен двум первым методам.
Теперь ссылки на два наших метода (и на все аналогичные) можно сохранять в переменные, объявленные с типом созданного функционального интерфейса Activity. Например, так:
Dog dog = new Dog();
Cat cat = new Cat();
Activity eating = dog::eat;
Activity playing = cat::play;
Теперь, если выполнить единственный метод переменной интерфейса, то будет вызван соответствующий сохранённый в переменную метод, например: eating.interactWith("a bone"); выполнит метод eat объекта dog, а playing.interactWith("a bone"); соответственно выполнит метод play объекта cat.
Приведённая ниже программа демонстрирует работу этого принципа. Программа выводит одну из двух надписей в зависимости от того, true или false вернёт new Random().nextBoolean().
class Dog {
public void eat(String food) {
System.out.println("Dog is eating " + food);
}
}
class Cat {
public void play(String item) {
System.out.println("Cat is playing with " + item);
}
}
@FunctionalInterface
interface Activity {
void interactWith(String mean);
}
public class MethPass {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
Activity eating = dog::eat;
Activity playing = cat::play;
if (new Random().nextBoolean()) {
methodUser(eating);
} else {
methodUser(playing);
}
}
public static void methodUser(Activity activity) {
activity.interactWith("a bone");
}
}