3

我正在尝试编写一个函数,因此我可以将一个函数作为参数传递,例如

public class HashFunction {
    private Function f;
    public HashFunction(Function f) {
        this.f=f;
    }
    public Integer hash(String s){
        return f(s);
    }
}

所以我可以写代码

new HashFunction(function(String s){ return s.charAt(0)+0; });

就像在 javascript 中一样。我怎样才能做到这一点?

4

5 回答 5

5

与许多其他现代语言不同,目前 java 在语法上不支持“浮动代码块”(称为闭包)。

然而,这个概念可以通过使用匿名类来实现,匿名类是“运行中”的实现声明,通常实现一个接口,但也可以扩展一个类。


以下是您在 java 中编写示例的方法:

public interface Hasher {
    int getHash(String s);
}

public class HashFunction {
    private Hasher f;
    public HashFunction(Hasher f) {
        this.f=f;
    }
    public Integer hash(String s){
        return f(s);
    }
}

然后使用:

new HashFunction(new Hasher() {
    public int getHash(String s) {return s.charAt(0)+0;}
});
于 2012-11-23T00:46:01.460 回答
3

在 Java 中不可能将函数作为参数传递,除非他们在最近的语言更改中添加了它。

Java 模式是使用所谓的匿名类,它实现具有所需行为的成员方法。

例如,请参阅:

http://docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

或者

Java 中如何使用匿名(内部)类?

于 2012-11-23T00:32:57.427 回答
2

我觉得你可以使用interface,同样的方式like Comparableor Comparatorinterface,或者使用注解标记一些函数,然后使用反射调用它们

请检查这个

于 2012-11-23T00:33:52.627 回答
2

我只能支持其他答案。基本上,不可能将真正的引用传递给函数,比如在 JavaScript 或 Haskell 中,“一切都是函数”。

但是,如果您想在代码中加入一点“函数式”风格的编程,请查看http://functionaljava.org/上的“函数式 Java”库

也许看看Scala也会有所帮助,因为它在 JVM 中运行,并且是一种非常成熟、即将到来的现代编程语言。在 Scala 中,您可以传递函数,它也可以与您现有的 Java 代码互操作。(有函数、函子、单子、列表推导......)

于 2012-11-23T00:54:40.347 回答
0

函数在java中称为方法。你可以通过他们!
但这是高级java。使用 java.lang.reflection.Method 传递一个方法。
但是您不会对这种技术感到满意。

于 2012-11-23T01:22:54.790 回答