Это связано с этим вопросом: Как выполнять композицию функций?
Я заметил, что ссылка на метод может быть назначена переменной, объявленной как Function
, и поэтому я предполагаю, что она должна иметь функцию andThen
или compose
, и, следовательно, я ожидаю, что мы сможем составить их напрямую. Но, видимо, нам нужно назначить их переменной, объявленной как Function
first (или типу-лить перед вызовом), прежде чем мы сможем называть andThen
или compose
на них.
Я подозреваю, что у меня может быть неправильное представление о том, как это должно работать.
Итак, мои вопросы:
- Зачем нам нужно сначала вводить или назначать его переменной, прежде чем мы сможем вызвать метод
andThen
? - Каков именно тип ссылки на метод, который нужно сделать таким образом?
Пример кода ниже.
public class MyMethods{
public static Integer triple(Integer a){return 3*a;}
public static Integer quadruple(Integer a){return 4*a;}
public int operate(int num, Function<Integer, Integer> f){
return f.apply(num);
}
public static void main(String[] args){
MyMethods methods = new MyMethods();
int three = methods.operate(1, MyMethods::triple); // This is fine
// Error below
// int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple));
// But this one is fine
Function<Integer, Integer> triple = MyMethods::triple;
Function<Integer, Integer> quadruple = MyMethods::quadruple;
int twelve = methods.operate(1, triple.andThen(quadruple));
// This one is also fine
int twelve2 = methods.operate(1, ((Function<Integer, Integer>)MyMethods::triple).andThen(MyMethods::quadruple));
}
}
Подробное описание ошибки
В Eclipse он высвечивается с сообщением об ошибке:
Целевой тип этого выражения должен быть функциональным интерфейсом
и в компиляторе Java 8 ошибка:
java8test.java:14: error: method reference not expected here int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple)); ^ 1 error
(на самом деле, почему ошибка в Eclipse отличается от ошибки в компиляторе Java 8)