Java 如何调用函子对象';在不调用调用方法的情况下调用函数
我有一个函子对象:Java 如何调用函子对象';在不调用调用方法的情况下调用函数,java,lambda,functional-programming,functor,Java,Lambda,Functional Programming,Functor,我有一个函子对象: private static Func1<MyEvent, Observable<Data>> getDataOnEvent = new Func1<MyEvent, Observable<Data>>() { @Override public Observable<Data> call(MyEvent event) { return ApiFactory.get().getData(
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(someEvent)
就像是用Python和Javascript完成的一样?也许是java的新版本或Lombok之类的库?只要使用
private static Observable<Data> getDataOnEvent(MyEvent event) {
return ApiFactory.get().getData()
}
然后,您可以使用getDataOneEvent(event)
调用它,或getDataOneEvent
在需要时将其引用为Func1
实例
如果
Func1
不是函数接口,那么您就不能以这种紧凑的形式创建函数,但另一方面,在这种情况下,要求支持调用任意方法而不显式命名也是不合理的。我知道您的意思,像这样的groovy代码:
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代码如下:
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;
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);
但是我可以告诉你java gammar不支持字段/变量的这个特性,也许在下一个jdk中会启用字段/变量引用的这个特性
幸运的是,如果static成员是方法,则支持直接调用方法,例如:
import static java.lang.Math.abs;
assert abs(-1) == 1;
如果您真的想要像方法调用一样调用标识符,您可以伪造如下所示:
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;
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);
Groovy的闭包支持这种功能,但我想不出Java本机支持这种功能的地方。您可以创建一个包含调用的方法,但我认为这不是您想要的,Kotlin也支持这种功能。@OliverCharlesworth将Kotlin视为Java的包装器是不正确的吗?对我来说,Kotlin拥有这个功能是有意义的,因为如果我的理解是正确的,
GetDataOneEvent(someEvent)
实际上只是在幕后执行GetDataOneEvent.call(someEvent)
。@Ishnark-这正是它在幕后执行的操作,但在JVM级别。Kotlin只是编译到JVM的另一种语言。所以它是Java的兄弟,不是包装器。在阅读了您的解决方案后,我发现我可以为OP提供另一个答案,对吗?您总是可以在“调用方法的方法和函数”和“调用函数的函数和方法”之间进行选择。由于在Java中,函数始终是一个具有方法的类,调用函数的方法基本上是调用另一个方法,因此我更喜欢用真正的Java方式定义函数,即包含代码的方法,特别是如果函数类型是可以通过方法引用实现的函数接口。但即使我认为我的变体更自然,也值得一提。“霍格尔^ ^,谢谢你给了这么多有价值的信息。我从这些评论中学到了更多。