gpt4 book ai didi

java - 如何调用存储在 HashMap 中的方法? ( java )

转载 作者:IT老高 更新时间:2023-10-28 20:30:59 26 4
gpt4 key购买 nike

我有一个命令列表(i、h、t 等),用户将在命令行/终端 Java 程序中输入这些命令。我想存储命令/方法对的哈希:

'h', showHelp()
't', teleport()

这样我就可以编写如下代码:

HashMap cmdList = new HashMap();

cmdList.put('h', showHelp());
if(!cmdList.containsKey('h'))
System.out.print("No such command.")
else
cmdList.getValue('h') // This should run showHelp().

这可能吗?如果没有,有什么简单的方法?

最佳答案

使用 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"
}
}

在这种情况下,我很懒惰并重用了 Runnable接口(interface),但也可以使用 Command -我在答案的 Java 7 版本中发明的接口(interface)。

此外,() -> { ... } 还有其他替代方案句法。您也可以拥有 help 的成员函数和 teleport并使用 YourClass::help分别YourClass::teleport而是。


Java 7 及以下

您真正想做的是创建一个接口(interface),例如命名为 Command (或重用例如 Runnable ),并让您的 map 类型为 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");
}
}

关于java - 如何调用存储在 HashMap 中的方法? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4480334/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com