地图:在Java地图中,我可以为<k,v>对中的值分配函数吗?</k,v>

时间:2013-07-12 07:47:46

标签: java hashmap

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

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

8 个答案:

答案 0 :(得分:4)

将您的函数封装在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();

答案 1 :(得分:3)

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

答案 2 :(得分: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"); } });

答案 3 :(得分:1)

请参阅What's the nearest substitute for a function pointer in Java?

您可以尝试在此页面上找到几个不同的答案。

答案 4 :(得分:1)

如果您希望这对地图的用户透明,则必须实施自己的地图。

答案 5 :(得分: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;
    });

答案 6 :(得分: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("**************************************");
    } 
}

答案 7 :(得分:1)

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

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

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

其中Function<V>应该是展示V apply()方法的接口。

您的实现应该与此类似:

class ApplicativeMapImplementation实现ApplicativeMap {      私人地图&gt;功能;

 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();
   }
 }