Полностью рабочий пример
import java.util.function.BiConsumer;
class SimpleClass {
void methodA(String a, String b) {
System.out.printf("%s %s", a, b);
}
}
class Service {
void doService(BiConsumer<String,String> method) {
method.accept("Hola", "mundo");
}
}
class Main {
public static void main(String ... args) {
SimpleClass sc = new SimpleClass();
Service s = new Service();
s.doService(sc::methodA);
}
}
Потому что нет типов функций в Java 8, вы должны указать свою подпись службы, чтобы принять один из functional interfaces.
В общих чертах, если метод принимает аргументы, но не возвращает результат: это Consumer
. Если он возвращает Boolean, то это Predicate
, и если он возвращает какое-то другое значение, это Function
. Есть и другие, такие как Supplier
и другие.
В идеальном мире мы бы написали:
class Service {
void doService(void(String,String) method /*<-- fictional method type*/) {
method("Hello", "world");
}
}
Но мы должны использовать эти функциональные интерфейсы в данный момент.
This is a very good read about method references in Java 8
Есть экземпляр 'SimpleClass'? Или методы статичны? – shmosel
Связанный вопрос был задан обратно до Java 8, но с тех пор [получил новые ответы] (http://stackoverflow.com/a/25005082/1743880) с помощью «Java 8 way», чтобы сделать это и эффективно канонический вопрос по этому вопросу. – Tunaki