Как в 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");

}

}