对返回接口的方法的静态引用(带 :: )

Static reference ( with :: ) to a method returning an interface

我有几个预定义的静态 "processors" 实现相同的方法,例如:

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

现在假设我有一些对象可以提供额外的列表 "processors"。

我正在尝试使用 interface 来定义那些额外的 "processors"。

    static interface IProcessor{
        double process(double num);
    }

实现一个带有额外的对象"processors":

    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

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

test(SomeObject.getExtraProccessors()::process, 1);
  • SomeObject.getExtraProccessors() returns 函数接口实例 IProcessor.
  • SomeObject::getExtraProccessors是对SomeObjectclass.
  • 的静态方法getExtraProccessor的方法引用

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

test(d-> SomeObject.getExtraProccessors().process(d), 1d);

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

如果你想return一个"processors"的列表,那么你可以这样做:

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