2017-04-07 30 views
1

我有一個仿函數對象:如何調用仿函數對象的功能,而不必調用調用方法

private static Func1<MyEvent, Observable<Data>> getDataOnEvent = new Func1<MyEvent, Observable<Data>>() { 
    @Override 
    public Observable<Data> call(MyEvent event) { 
     return ApiFactory.get().getData() 
    } 
}; 

對於它的調用我需要這樣做:

result = getDataOnEvent.call(someEvent) 

是否有可能做到這一點,而不是:

result = getDataOnEvent(someEvent) 

就像它是用Python和Javascript完成的?也許新版本的Java或像Lombok這樣的庫?

+0

這種功能在Groovy的閉包中得到了支持,但我想不出任何在Java中本地支持的功能。 – Brian

+0

您可以創建一個包含該調用的方法,但我認爲這不是您想要的 – SilverNak

+0

還受Kotlin支持。 –

回答

1

只要使用,

private static Observable<Data> getDataOnEvent(MyEvent event) { 
    return ApiFactory.get().getData() 
} 

,並且可以調用result = getDataOnEvent(someEvent);當您需要它。正如您所看到的,通過這種方式寫入,將比調用端的五個字母.call節省更多的鍋爐代碼。

如果Func1是一個功能接口,則可以在需要Func1<MyEvent, Observable<Data>>的地方使用ContainingClass::getDataOnEvent。您也可以將其存儲到static變量,如果你喜歡使用簡單的標識符getDataOnEvent的功能:

private static Func1<MyEvent, Observable<Data>> getDataOnEvent 
               = ContainingClass::getDataOnEvent; 

然後你可以使用getDataOnEvent(event)調用或getDataOnEvent指它作爲一個Func1例如,當您需要它。

如果Func1不是一個函數接口,那麼你不能創建這個緊湊形式的函數,但另一方面,在這種情況下,要求支持調用任意方法是不合理的沒有明確地命名它,要麼。

+0

嗨,Holger。在閱讀你的解決方案後,我發現我可以給OP提供另一個答案,對嗎? –

1

我知道你的意思,Groovy代碼call a closure這樣的:

def code = { 123 }; 

//can be called like any other method if the variable is a closure. 
assert code() == 123; 
//can be call explicitly by using `call` method 
assert code.call() == 123; 

JavaScript代碼call a function這樣的:

let code =() => 123; 

//can be called like any other function if the variable is a function. 
assert code() == 123; 
//can be call explicitly by using `call` method 
assert code.call() == 123; 

但我可以告訴你java的gammar不支持此功能的領域/變量,也許在下一個jdk中會啓用這個功能,其中一個字段/變量指的是Callable

幸運的是,Single-Static-Import Declarations支持調用一個方法直接,如果靜態成員是一個方法,例如:

import static java.lang.Math.abs; 

assert abs(-1) == 1; 

如果你真的想叫像一個方法調用的標識符,可以是這樣的:

class ApiFactory { 

    public static Func1<MyEvent, Observable<Data>> getDataOnEvent = new Func1<MyEvent, Observable<Data>>() { 
     public Observable<Data> call(MyEvent event) { 
      return ApiFactory.get().getData(); 
     } 
    }; 

    public static Observable<Data> getDataOnEvent(MyEvent event) { 
     return getDataOnEvent.call(event); 
    } 

} 

那麼你可以這樣調用:

import static ${package}.ApiFactory.getDataOnEvent; 
// which is calling a static method 
result = getDataOnEvent(event); 
// which is calling a static field 
result = getDataOnEvent.call(event); 
+0

您始終可以在「調用方法的方法和函數」和「調用函數的函數和方法」之間進行選擇。由於在Java中,函數總是一個具有方法的類,調用該函數的方法基本上調用另一個方法,我更喜歡定義函數真正的Java方法,即包含代碼的方法,特別是如果函數類型是功能界面可以通過方法參考來實現。但即使我認爲我的變體更自然,但值得一提的是替代方案。 – Holger

+0

@Holger^_ ^,感謝您提供如此多有價值的信息。我從評論中瞭解更多。 –

相關問題