2

我有一组字符串,我将使用它作为键,对于一个特定的字符串,我希望调用一个函数。那么是否可以为该对中的值分配一个函数?

exampleMap.get("SOME_STRING"); // should call a function abc();
4

7 回答 7

5

将您的函数封装在 Java 接口中:

public interface Task {
    void doSomething();
}

然后用这个接口的实例填充地图:

map.put("someString", new Task() {
    @Override
    public void doSomething() {
        System.out.println("foo");
    }
});
map.put("someOtherString", new Task() {
    @Override
    public void doSomething() {
        System.out.println("bar");
    }
});

然后调用与给定字符串关联的函数(任务)s

map.get(s).doSomething();
于 2013-07-12T07:53:11.560 回答
3

不,java 还不支持任何方法对象。您可以使用反射或尝试用枚举常量替换字符串并调用它们的方法。

于 2013-07-12T07:49:29.417 回答
2

Java 不直接支持它,但您可以使用接口间接支持它。

public interface Funct {
  public void apply();
}

然后当您想将其用作价值时,请执行类似..

Map<String, Funct> aMap = new HashMap<String, Funct>();
aMap.put("foo", new Funct() { public void apply() { System.out.println("bar"); } });
于 2013-07-12T07:53:31.060 回答
1

是的。虽然,它是“函数”的 java 版本:一个匿名类。

最好用一个例子来说明:

interface MyFunction {
    public int calculate(int a, int b);
}

Map<String, MyFunction> map = new HashMap<String, MyFunction>();

map.put("add", new MyFunction() {
    public int calculate(int a, int b) {
        return a + b;
    });

map.put("multiply", new MyFunction() {
    public int calculate(int a, int b) {
        return a * b;
    });

于 2013-07-12T08:00:24.730 回答
1

如果您希望这对 Map 的用户是透明的,您必须实现自己的 Map。

于 2013-07-12T07:55:20.410 回答
1

您可以通过使用反射来做到这一点。考虑以下代码。

Map<String, Method> map = new HashMap<String, Method>();
SomeClass obj = new Someclass();
Method method = null;
try {
    method = obj.getClass().getMethod("someMethod", param1.class, param2.class, ...);
} catch (SecurityException e) {
} catch (NoSuchMethodException e) {
}   
map.put("someMethod", method);

try {
    (map.get("someMethod")).invoke(obj, arg1, arg2, ...);
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}

内部要调用的方法SomeClass

public class SomeClass    {
// Other class contents
    public void someMethod()    {
    // Target method contents
    }
}

使用上述逻辑的示例代码:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

public class Temp3 {
    public static void main(String[] args) {
        Map<String, Method> map = new HashMap<String, Method>();
        Temp3 obj = new Temp3();
        Method method = null;
        try {
            method = obj.getClass().getMethod("someMethod");
        } catch (SecurityException e) {
        } catch (NoSuchMethodException e) {
        }

        map.put("someMethod", method);

        try {
            (map.get("someMethod")).invoke(obj);
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        } catch (InvocationTargetException e) {
        }
    }

    public void someMethod()    {
        System.out.println("**************************************");
    } 
}
于 2013-07-12T08:02:30.143 回答
1

如果你想要这种行为,你应该定义你自己的类。

该类至少应实现以下接口:

interface ApplicativeMap<K,V>{
  void put(K key, Function<V> producer);
  V get(K key);

whereFunction<V>应该是一个暴露V apply()方法的接口。

您的实现应该类似于以下内容:

类 ApplicativeMapImplementation 实现 ApplicativeMap{ private Map> 函数;

 public void put(K key, Function<V> producer){
   functions.put(key, producer);
 }

 public V get(K key){
   if(functions.containsKey(key)){
     return functions.get(key).apply();
   } else{
     throw new NoSuchElementException();
   }
 }
于 2013-07-12T08:11:51.897 回答