2

我最近一直在玩函数式编程,我怀疑它对我有影响。但是我想用 Java 做一些事情,但我不确定它是否可以完成。

我有一个“A”类型的对象“ob”。我还有一个方法库(数千个,自动生成的,采用相同的参数),我可能想附加到 ob。我希望能够写的是

A ob = new A(Someint, someint, Method mymethod);

然后能够(在A内)写出类似的东西)

X = mymethod.call(arg1, arg2);

Java中有什么东西可以让我这样做吗?还是我离光太远了?

4

3 回答 3

1

你不能在 Java 中完全做到这一点。作为一种解决方法,您可以使用匿名内部类。

定义一个接口:

interface Func <A, B> {
    A run (B arg);
}

即时实例化它以创建一个“函数对象”:

C ob = frobn (someint,
              new Func <int, long> () {
                  @Override
                  int run (long arg) {
                       // do something to return that int
                  }
              });

然后你像这样调用传递的Func内部frobn

C frobn (int some, Func <int, long> fun) {
    // do something
    int foo = fun.run (bar);
    // do something
}

是的,那是丑陋的绿色纺纱。

于 2013-09-04T08:24:48.037 回答
1

您真正需要的是支持 lambda 的 Java 8。其他任何事情都会非常难看。(即使有了这个 Java 有功能支持,但没有像真正的功能语言)我建议你试试

http://jdk8.java.net/lambda/

有了这个,您可以编写 lambdas 行p -> p.getPrice()和函数引用,例如MyClass::myMethod

http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

于 2013-09-04T08:07:26.277 回答
0
Passing a Method reference to a method and then invoking the method with parameters.

有多种方法可以做到这一点。此说明性示例使用名为 myMethod 的静态方法,将一个对象作为参数。

import java.lang.reflect.Method;

public class Tester54 {

    static public class J42 {
        static public Object myMethod(final Object o) {
            return "Wow:" + o.toString();
        }
    }

    private static void 
    doIt(final Class<?> c, final Method m, final Class<?>[] types, final Object[] args) 
        throws Exception {
        final Object s = m.invoke(J42.class, new Object[] { "wow" });
        System.out.println(s);
    }

    public static void main(final String[] a) throws Exception {
        final Method m = J42.class.getMethod("myMethod", new Class<?>[] { Object.class });
        final Class<?>[] types = new Class[] { Object.class };
        final Object[] args = new Object[] { "wow" };
       doIt(J42.class, m, types, args);
    }

}

于 2013-09-04T08:52:51.747 回答