使用 Java 8+ 和 Lambda 表达式
使用lambdas(在Java 8 +中可用),我们可以按如下方式完成:
class Test {
public static void main(String[] args) throws Exception {
Map<Character, Runnable> commands = new HashMap<>();
// Populate commands map
commands.put('h', () -> System.out.println("Help"));
commands.put('t', () -> System.out.println("Teleport"));
// Invoke some command
char cmd = 't';
commands.get(cmd).run(); // Prints "Teleport"
}
}
在这种情况下,我很懒惰并重用了该接口,但是也可以使用我在Java 7版本的答案中发明的-interface。Runnable
Command
此外,还有语法的替代方法。您也可以为 和 使用 resp 提供成员函数。 相反。() -> { ... }
help
teleport
YourClass::help
YourClass::teleport
Java 7 及更低版本
您真正想做的是创建一个接口,例如命名(或重复使用),并让您的映射类型为 。喜欢这个:Command
Runnable
Map<Character, Command>
import java.util.*;
interface Command {
void runCommand();
}
public class Test {
public static void main(String[] args) throws Exception {
Map<Character, Command> methodMap = new HashMap<Character, Command>();
methodMap.put('h', new Command() {
public void runCommand() { System.out.println("help"); };
});
methodMap.put('t', new Command() {
public void runCommand() { System.out.println("teleport"); };
});
char cmd = 'h';
methodMap.get(cmd).runCommand(); // prints "Help"
cmd = 't';
methodMap.get(cmd).runCommand(); // prints "teleport"
}
}
反射“黑客”
话虽如此,你实际上可以做你要求的事情(使用反射和类)。Method
import java.lang.reflect.*;
import java.util.*;
public class Test {
public static void main(String[] args) throws Exception {
Map<Character, Method> methodMap = new HashMap<Character, Method>();
methodMap.put('h', Test.class.getMethod("showHelp"));
methodMap.put('t', Test.class.getMethod("teleport"));
char cmd = 'h';
methodMap.get(cmd).invoke(null); // prints "Help"
cmd = 't';
methodMap.get(cmd).invoke(null); // prints "teleport"
}
public static void showHelp() {
System.out.println("Help");
}
public static void teleport() {
System.out.println("teleport");
}
}