Java 如何使用方法作为值创建HashMap?

Java 如何使用方法作为值创建HashMap?,java,oop,hashmap,Java,Oop,Hashmap,我正在开发一个可以接收多个命令的小程序。这些命令中的每一个都应该导致运行不同的方法。我在想,如果有一种方法可以将所有方法放在HashMap中,并通过将值与命令键配对来直接调用它们,而不是使用if语句,这可以使事情变得更简单,但据我所知,这是不可能的,因为在Java中方法不被视为对象。尽管如此,找出是否有办法做到这一点还是很有教育意义的。方法不是对象(至少大部分不是),但有一个概念符合您的需要:函数接口,它被定义为只有一个抽象方法的接口。两个现成的候选项是,不带参数,和,只带一个参数,如果您想传入

我正在开发一个可以接收多个命令的小程序。这些命令中的每一个都应该导致运行不同的方法。我在想,如果有一种方法可以将所有方法放在HashMap中,并通过将值与命令键配对来直接调用它们,而不是使用if语句,这可以使事情变得更简单,但据我所知,这是不可能的,因为在Java中方法不被视为对象。尽管如此,找出是否有办法做到这一点还是很有教育意义的。

方法不是对象(至少大部分不是),但有一个概念符合您的需要:函数接口,它被定义为只有一个抽象方法的接口。两个现成的候选项是,不带参数,和,只带一个参数,如果您想传入某种输入(如
扫描仪
),这可能是最好的选择。(如果您还需要可配置的输出,
BiConsumer
使用
扫描仪
PrintWriter
可能比较合适。)

Java有一个称为方法引用的便利特性,可以自动将方法转换为函数接口的实例。放在一起,它可能看起来像这样:

Map<String, Consumer<Scanner>> commands = new HashMap<>();
...
commands.put("foo", someCommand::go); // where someCommand is a variable with a go(Scanner) method
commands.put("bar", new OtherCommand());
commands.put("hello", unused -> { System.out.println("Hello!"); });
...
String commandName = scanner.next();
commands.get(commandName).accept(scanner);
Map命令=newhashmap();
...
commands.put(“foo”,someCommand::go);//其中someCommand是一个带有go(Scanner)方法的变量
commands.put(“bar”,新的OtherCommand());
commands.put(“hello”,未使用->{System.out.println(“hello!”);});
...
String commandName=scanner.next();
commands.get(commandName).accept(scanner);
方法不是对象(至少大多数情况下不是),但有一个概念符合您的需求:函数接口,它被定义为只包含一个抽象方法的接口。两个现成的候选项是,不带参数,和,只带一个参数,如果您想传入某种输入(如
扫描仪
),这可能是最好的选择。(如果您还需要可配置的输出,
BiConsumer
使用
扫描仪
PrintWriter
可能比较合适。)

Java有一个称为方法引用的便利特性,可以自动将方法转换为函数接口的实例。放在一起,它可能看起来像这样:

Map<String, Consumer<Scanner>> commands = new HashMap<>();
...
commands.put("foo", someCommand::go); // where someCommand is a variable with a go(Scanner) method
commands.put("bar", new OtherCommand());
commands.put("hello", unused -> { System.out.println("Hello!"); });
...
String commandName = scanner.next();
commands.get(commandName).accept(scanner);
Map命令=newhashmap();
...
commands.put(“foo”,someCommand::go);//其中someCommand是一个带有go(Scanner)方法的变量
commands.put(“bar”,新的OtherCommand());
commands.put(“hello”,未使用->{System.out.println(“hello!”);});
...
String commandName=scanner.next();
commands.get(commandName).accept(scanner);

这不是一个好主意,使方法作为hashmap值不满足shell命令的复杂场景,也许可以使用Runnable对象作为值

另一种解决方案是,可以使用SpringShell

@ShellMethod("commandName")
public String doSomething(String param) {
    return String.format("Hi %s", param);
}

这不是一个好主意,使方法作为hashmap值不满足shell命令复杂的场景,也许可以使用Runnable对象作为值

另一种解决方案是,可以使用SpringShell

@ShellMethod("commandName")
public String doSomething(String param) {
    return String.format("Hi %s", param);
}

您已经很好地描述了“命令设计模式”。查一下并考虑实施它。看看这个问答题,请多看看。“我不知道如何回答我最初的关于把方法放到HashMaps的问题,但这可能只是我几周前开始的java中的相对文盲。你已经很好地描述了“命令设计模式”。查一查,并考虑实施它。看看这个问答题,更多的关于这个:“不知道如何更好,我不知道这是如何回答我的问题,把方法注入到HashMaps,但这可能只是我的相对文盲在java,因为我几周前才开始。谢谢这个答案,非常有用谢谢你的回答,非常有用