当前位置: 首页 > 知识库问答 >
问题:

如何调用存储在HashMap中的方法?(Java)[副本]

孟成文
2023-03-14

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

'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().

这可能吗?如果不是,有什么简单的方法可以做到这一点?

共有1个答案

封瑞
2023-03-14

使用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接口,但也可以使用我在Java 7版答案中发明的command接口。

此外,还有()->{...}语法的替代方法。您也可以使用helpteleport的成员函数,并使用YourClass::helpYourClass::Teleport

>

  • 关于Programming.Guide的Lambda小抄。

    Oracle教程在这里:Java教程™-兰姆达表达式。

    您真正想要做的是创建一个接口,命名为instancecommand(或重用instancerunnable),并让您的映射类型为map 。像这样:

    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程序上输入的命令列表(i,h,t等)。我想存储命令/方法对的哈希: 这样我就可以得到类似以下的代码: 这可能吗?如果没有,那么简单的方法是什么? 问题答案: 使用Java 8+和Lambda表达式 使用lambda(可在Java 8+中使用)进行以下操作: 在这种情况下,我很懒惰并重用了该接口,但是也可以使用我在答案的Java 7版本中发明的-。 此外,

    • 你好,我正在开发Angularjs应用程序。我正在尝试调用post方法,但我无法调用post方法。 下面是我的代码。 在请求头,我可以看到请求方法:选项,但我做了POST请求?我能知道我做错了什么吗?如有任何帮助,我们将不胜感激。谢谢.

    • 问题内容: 假设您有一个键类(KeyClass),该键类具有重写的equals,hashCode和clone方法。假设它有2个基本字段,一个String(名称)和一个int(id)。 现在您定义 现在 因此,就HashMap而言,keyOriginal,keyCopy和keyClone是无法区分的。 现在,如果您使用keyOriginal将条目放入HashMap,则可以使用keyCopy或keyC

    • 问题内容: 我的哈希图将字符串存储为键,将arraylist存储为值。现在,我需要将其嵌入到列表中。也就是说,它将具有以下形式: 这些是我使用的声明: 谁能帮我在列表中使用哪种方法以及如何继续将地图存储到其中? 问题答案: 始终尝试在Collection中使用接口引用 ,这会增加灵活性。 以下代码有什么问题? 您可以像上面一样轻松地进行操作。

    • 我正在尝试使用put方法将arraylist存储在hashmap中。我在下一步中清除了列表,以便在下一次迭代中添加下一组值。一旦清除列表,地图中的值也会被清除。虽然我在清理清单之前已经把清单放在地图上了。 sysout打印{key=[]} 有人请让我清楚如何坚持hashmaphash地图。