当前位置: 首页 > 面试题库 >

Java 如何调用存储在HashMap中的方法?

闻人修明
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().

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


问题答案:

使用Java 8+和Lambda表达式
使用lambda(可在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接口,但是也可以使用Command我在答案的Java 7版本中发明的-interface

此外,() -> { ... }语法还有其他选择。你也可以具有和的成员函数help,teleport并使用YourClass::helprespYourClass::teleport代替。

  • Programming.Guide上有一篇很棒的Lambda备忘单。
  • 此处的Oracle教程:Java教程™– Lambda表达式。

Java 7及以下
你真正想要做的是创建一个接口Command(例如命名)(或例如重用Runnable),然后让你的地图成为type 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"

    }
}

Reflection "hack"

话虽如此,你实际上可以完成你所要的工作(使用反射和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等)。我想存储命令/方法对的哈希: 这样我就可以拥有类似于以下内容的代码: 这可能吗?如果不是,有什么简单的方法可以做到这一点?

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

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

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

  • 问题内容: 我对Redis中的HSET有疑问。据我所知,redis是一个键值数据库。这意味着所有事物都存储为键值,例如,我们没有表。我想在redis中保存一些内容,所以我决定使用Hashmap。由于HMSET已过时,我们应该改用HSET,我应该如何在hset中存储许多属性作为值和id作为键?你知道我想保存这样的东西: 但是,如果我要保存很多字段,我应该为每个字段写这一行?例如 : 如在HSET中,