У меня есть несколько предопределенных статических «процессоров», реализующих один и тот же метод, например:
default double process(double num){
Образец :
public class Test {
public static void main(String[] args) {
test(Test::processor1, 1d);
test(Test::processor2, 1d);
}
static double processor1(double num){
return num * 10;
}
static double processor2(double num){
return num * 20;
}
//...
static void test(Function<Double, Double> f, double d){
// Do something util here
System.out.println(f.apply(d));
}
...
Теперь представьте, что у меня есть объекты, которые могут предоставить список дополнительных «процессоров».
Я пытаюсь использовать interface
для определения этих дополнительных «процессоров».
static interface IProcessor{
double process(double num);
}
Реализация объекта с дополнительными «процессорами»:
static class SomeObject{
// Just return one but should be a list...
static IProcessor getExtraProccessors(){
return new IProcessor(){
public double process(double num){
return num * 30;
}
};
}
}
Здесь все компилируется и работает нормально. Но теперь я застрял.
Используя SomeObject::getExtraProccessors
, у меня есть ссылка на статический метод, возвращающий интерфейс, как я могу вызвать метод интерфейса?
Моя первая попытка была с
test(SomeObject::getExtraProccessors::process, 1d);
Но это не компилируется, давая The target type of this expression must be a functional interface
Итак, не могли бы вы сказать мне, возможно ли это сделать, и если да, то как? И если это невозможно, как мне это сделать?
DoubleUnaryOperator
вместоFunction<Double, Double>
и вместоIProcessor
. - person Paul Boddington   schedule 15.04.2016IProcessor
, вместо этого возвращайте лямбда:return n -> n * 30;
. И если вам нужен список: вернитеArrays.asList(n -> n * 30, n -> n / 2, ...)
. Кроме того, как сказал @PaulBoddington,DoubleUnaryOperator
- это интерфейс, предоставляемый Java для работы с одним операндомdouble
. - person fps   schedule 15.04.2016