12

我有几个预定义的静态“处理器”实现相同的方法,例如:

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));
    }   
    ...

现在想象一下,我有一些可以提供附加“处理器”列表的对象。

我正在尝试使用 aninterface来定义那些额外的“处理器”。

    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

所以请你告诉我是否可以这样做,如果可以,怎么做?如果不可能,我该怎么做?

4

3 回答 3

7
test(SomeObject.getExtraProccessors()::process, 1);
  • SomeObject.getExtraProccessors()返回功能接口的实例IProcessor
  • SomeObject::getExtraProccessorsgetExtraProccessor是对类的静态方法的方法引用SomeObject
于 2016-04-15T11:00:13.800 回答
3

如何使用 lambda 表达式而不是方法引用:

test(d-> SomeObject.getExtraProccessors().process(d), 1d);
于 2016-04-15T11:01:53.427 回答
2

我认为您不需要创建实现IProcessor. 实际上,如果您要使用 a 进行操作double,则根本不需要该IProcessor接口。Java 提供了DoubleUnaryOperator正是为此而设计的接口。

如果你想返回一个“处理器”列表,那么你可以这样做:

static class SomeObject {

    static List<DoubleUnaryOperator> getExtraProccessors() {
        return new ArrayList<>(Arrays.asList(Test::processor1, Test::processor2));
    }   
}  

然后,假设您将test方法更改为:

static void test(DoubleUnaryOperator f, double d) {
    // Do something util here
    System.out.println(f.applyAsDouble(d));
} 

您可以按如下方式使用它:

test(SomeObject.getExtraProcessors().get(0), 1);
于 2016-04-15T12:43:17.560 回答