我有一组字符串,我将使用它作为键,对于一个特定的字符串,我希望调用一个函数。那么是否可以为该对中的值分配一个函数?
exampleMap.get("SOME_STRING"); // should call a function abc();
将您的函数封装在 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();
不,java 还不支持任何方法对象。您可以使用反射或尝试用枚举常量替换字符串并调用它们的方法。
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"); } });
是的。虽然,它是“函数”的 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;
});
如果您希望这对 Map 的用户是透明的,您必须实现自己的 Map。
您可以通过使用反射来做到这一点。考虑以下代码。
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("**************************************");
}
}
如果你想要这种行为,你应该定义你自己的类。
该类至少应实现以下接口:
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();
}
}