2017-04-07 25 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^_ ^,感谢您提供如此多有价值的信息。我从评论中了解更多。 –

相关问题