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

时间:2016-04-15 10:55:01

标签: java java-8 method-reference functional-interface

我有几个预先设定的静态处理器"实现相同的方法,例如:

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

现在假设我有一些对象可以提供额外的&#34;处理器列表&#34;。

我尝试使用interface来定义其他&#34;处理器&#34;。

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

使用额外的&#34;处理器实现对象&#34;:

    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

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

3 个答案:

答案 0 :(得分:7)

test(SomeObject.getExtraProccessors()::process, 1);
  • SomeObject.getExtraProccessors() returns an instance of functional interface IProcessor.
  • SomeObject::getExtraProccessors is a method reference to the static method getExtraProccessor of the SomeObject class.

答案 1 :(得分:3)

How about using a lambda expression instead of method reference :

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

答案 2 :(得分:2)

我认为您不需要创建实现IProcessor的匿名内部类实例。实际上,如果您要使用double进行操作,则根本不需要IProcessor界面。 Java提供的DoubleUnaryOperator接口完全就是为了这个接口。

如果您想返回&#34;处理器&#34;的列表,那么您可以这样做:

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