2016-04-15 52 views
12

我有幾個predifined靜態的 「處理器」 的實施同樣的方法,例如:靜態引用(帶::)的方法返回一個接口

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

所以,請你能告訴我,如果有可能這一點,如果是如何? 如果這是不可能的,我應該如何呢?

+2

您可以使用'DoubleUnaryOperator'而不是'Function Double,Double>'而不是' IProcessor'。 –

+1

您不需要創建一個匿名的IProcessor內部類實例,而是返回一個lambda:'return n - > n * 30;'。如果你需要一個列表:返回'Arrays.asList(n - > n * 30,n - > n/2,...)'。另外,正如@PaulBoddington所說的那樣,'DoubleUnaryOperator'是Java提供的一個接口,用於操作一個'double'操作數。 –

回答

7
test(SomeObject.getExtraProccessors()::process, 1); 
  • SomeObject.getExtraProccessors()返回功能接口IProcessor的一個實例。
  • SomeObject::getExtraProccessors是參照SomeObject類的靜態方法getExtraProccessor的方法。
3

如何使用lambda表達式而不是方法參考:

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

我覺得你並不需要創建一個實現IProcessor匿名內部類的實例。實際上,如果你打算使用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); 
相關問題