如何在Java中将字符串映射到函数?

目前,我有一堆实现接口的Java类,这意味着它们都有一个方法。这个想法是每个类都有一些(例如,<10)成员,并且每个成员都通过该方法映射到该类中的方法,如下所示:ProcessorprocessRequest(String key)StringsprocessRequest

class FooProcessor implements Processor
{
    String key1 = "abc";
    String key2 = "def";
    String key3 = "ghi";
    // and so on...

    String processRequest(String key)
    {
        String toReturn = null;
        if (key1.equals(key)) toReturn = method1();
        else if (key2.equals(key)) toReturn = method2();
        else if (key3.equals(key)) toReturn = method3();
        // and so on...

        return toReturn;
    }

    String method1() { // do stuff }
    String method2() { // do other stuff }
    String method3() { // do other other stuff }
    // and so on...
}

你明白了。

这对我来说很好,但现在我需要一个从键到功能的运行时可访问的映射;并非每个函数实际上都返回一个 String(有些返回 void),我需要动态访问每个类中每个函数的返回类型(使用反射)。我已经有一个经理知道所有键,但不知道从键到功能的映射。

我的第一个直觉是用语句替换这个映射,就像我在Javascript中所做的那样。但是,Java不支持一流的函数,所以我在那里运气不好。我可能会挖出一个第三方库,让我使用一流的函数,但我还没有看到任何函数,我怀疑我是否需要一个全新的库。if-elseMap<String, Function>

我还想过将这些键放入数组中,并使用反射按名称调用方法,但是我看到此方法有两个缺点:String

  • 我的密钥必须与方法命名相同 - 或者以特定,一致的方式命名,以便于将它们映射到方法名称。
  • 这似乎比我现在的陈述要慢得多。效率是一个问题,因为这些方法往往会被频繁调用,我想尽量减少不必要的开销。if-else

TL;大卫:我正在寻找一种干净,开销最小的方法来将a映射到某种对象,我可以调用和调用(类似的东西)。我不介意使用第三方库,如果它真的适合我的需求。我也不介意使用反射,尽管我强烈希望避免每次执行方法查找时使用反射 - 也许使用一些将反射与反射相结合的缓存策略。StringFunctiongetReturnType()Map

关于获得我想要的东西的好方法的想法?干杯!


答案 1

没有任何一流的独立函数,但您可以使用接口执行所需的操作。创建表示函数的接口。例如,您可能具有以下各项:

public interface ComputeString
{
    public String invoke();
}

然后,您可以首先创建一个您想要的对象。使用地图将比反射快得多,并且还将提供更多的类型安全性,因此我建议上述内容。Map<String,ComputeString>


答案 2

虽然你不能有一等函数,但有一些匿名类可以基于接口:

interface ProcessingMethod {
   String method();
}

Map<String, ProcessingMethod> methodMap = new HashMap<String, ProcessingMethod>();
methodMap.put("abc", new ProcessingMethod() {
   String method() { return "xyz" }
});
methodMap.put("def", new ProcessingMethod() {
   String method() { return "uvw" }
});

methodMap.get("abc").method();

或者你可以使用Scala:-)