2

是否可以通过某种方法将函数分配给 Java 中的变量,例如 PHP 或 JavaScript?

...或者当涉及到 Java 时,这个领域是否以不同的方式工作?

4

5 回答 5

4

在 Java 中,您Method可以MethodHandles通过反射调用方法,但该语言尚不支持该方法。

在 Java 8 中,您将能够使用对方法的引用。

于 2012-11-22T16:58:10.577 回答
3

在今天的 Java 中,不,你不能。

最接近的是接口:您不存储函数,而是定义所需函数的接口的实现。

一个典型的例子是Comparator 接口的实现:

Comparator<ProductSearchResult> c = new Comparator<ProductSearchResult>() {
    public int compare(ProductSearchResult result1, ProductSearchResult result2) {
        return result1.product.getRsId().compareTo(result2.product.getRsId());
    }
};
Collections.sort(groupResults, c); // I pass a function, wrapped in my Comparator implementation
于 2012-11-22T16:56:51.880 回答
1

您拥有的最接近的是与接口相结合的内部类。这些不仅可以携带一个,而且可以携带许多功能(方法),如果愿意,可以将它们委托回主类方法。但是这个解决方案可能很容易过于重量级:

class Main {

   interface X { 
     void doX();
   }

   class Ref1 implements X {
     void doX() { doA(); };
   }

   class Ref2 implements X {
     void doX() { doB(); };
   }

   void doA() {  };
   void doB() {  };

   void demo() {
      X x = new Ref1();
      x.doX();
   }
}
于 2012-11-22T17:03:39.717 回答
1

这模拟了类似于 Lambdas 的东西......(如果您使用字符串以外的任何东西,您将需要更多的转换,但我保持示例简短)......

public class MyTest {

    public static void main(String[] args) {

        Lambda l = new Lambda() { public Object func(Object x) 
                                    { return "Hello " + x; } 
                                };

        System.out.println(l.func("Bob"));

        System.out.println(nowTryFromMethod(l));

        System.out.println((new Lambda() { public Object func(Object x) 
                                             { return "Goodbye " + x; }
                                         }).func("Harry"));
    }

    private static Object nowTryFromMethod(Lambda l) {
            return l.func("Jerry");
    }
}

class Lambda {

    public Object func(Object x) { return null; }
}

输出:

Hello Bob
Hello Jerry
Goodbye Harry

更新

Java 支持对1.8 版中称为Lambda的函数的引用

于 2012-12-05T15:37:28.880 回答
0

Java 不支持。

但是,您可以在 JVM 语言中非常轻松地做到这一点,例如在 Groovy 中。

或者你看看command-pattern

于 2012-11-22T17:07:32.673 回答