2013-07-12 30 views
2

我有一组字符串,我将用作键和特定字符串,我希望调用一个函数。那么是否可以为该对中的值分配一个函数?地图:在Java地图中,我可以将一个函数分配给<K,V>对中的值吗?

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

这是可能的唯一方法是实现自己的地图。 java中标准的框外Map实现不允许任何类似的东西。 – Santosh

+1

[如何调用存储在HashMap中的方法? (Java)](http://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java) – NINCOMPOOP

+0

不,是的,但不是你想要的。你必须使用反射,然后大约你应该问你的设计发生了什么 – MadProgrammer

回答

3

封装的功能的Java接口:

public interface Task { 
    void doSomething(); 
} 

,然后pouplate地图与此接口的实例:

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(); 
+0

你打败了我19秒! – vidit

+0

但是,只有当你还可以控制使用Map的代码(因为它现在必须调用'doSomething',它以前没有做过)。 – Thilo

+0

也许我误解了这个问题。我回答说:“是否可以将函数赋值给该对中的值”。如果OP每次调用'get()'时都需要调用某个函数,那么它就不再是一个Map了。 –

3

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

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"); } }); 
1

如果你想这是透明的地图的用户,你必须实现自己的地图。

1

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

用一个例子清楚示出:

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

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

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

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

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

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

}

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 
    } 
} 

使用上述逻辑的样本代码调用自己的班级。

类应该实现,至少,如下界面:

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

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

你的实现应该与此类似:

类ApplicativeMapImplementation实现ApplicativeMap { 私人地图>功能;

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(); 
    } 
} 
相关问题