Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何调用函子对象';在不调用调用方法的情况下调用函数_Java_Lambda_Functional Programming_Functor - Fatal编程技术网

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方式定义函数,即包含代码的方法,特别是如果函数类型是可以通过方法引用实现的函数接口。但即使我认为我的变体更自然,也值得一提。“霍格尔^ ^,谢谢你给了这么多有价值的信息。我从这些评论中学到了更多。