如何创建一个以方法为值的 HashMap?
How to create a HashMap with methods as values?
我正在开发一个可以接收多个命令的小程序。这些命令中的每一个都应该导致 运行 的不同方法。我在想,如果有一种方法可以将所有方法放入 HashMap 并通过将值与命令 Key 配对而不是使用 if 语句来直接调用它们,它可以使事情变得更简单,但据我了解这是不可能,因为方法在 Java 中不被视为对象。尽管如此,找出是否有办法做到这一点还是很有教育意义的。
方法不是对象(至少大部分不是),但是有一个概念可以满足您的需求:功能接口,它被定义为一个只有一个抽象方法的接口。两个 out-of-the-box 候选项是 Runnable
, which takes no parameters, and Consumer
,它采用单个参数,如果您想传递某种输入(例如 Scanner
),这可能是最佳选择。 (如果您还想要可配置的输出,BiConsumer
采用 Scanner
和 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);
这不是一个好主意,将方法作为hashmap值不满足shell命令复杂的场景,也许你可以使用Runnable Object作为值。
另一种解决方法,可以使用Spring Shell.
@ShellMethod("commandName")
public String doSomething(String param) {
return String.format("Hi %s", param);
}
我正在开发一个可以接收多个命令的小程序。这些命令中的每一个都应该导致 运行 的不同方法。我在想,如果有一种方法可以将所有方法放入 HashMap 并通过将值与命令 Key 配对而不是使用 if 语句来直接调用它们,它可以使事情变得更简单,但据我了解这是不可能,因为方法在 Java 中不被视为对象。尽管如此,找出是否有办法做到这一点还是很有教育意义的。
方法不是对象(至少大部分不是),但是有一个概念可以满足您的需求:功能接口,它被定义为一个只有一个抽象方法的接口。两个 out-of-the-box 候选项是 Runnable
, which takes no parameters, and Consumer
,它采用单个参数,如果您想传递某种输入(例如 Scanner
),这可能是最佳选择。 (如果您还想要可配置的输出,BiConsumer
采用 Scanner
和 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);
这不是一个好主意,将方法作为hashmap值不满足shell命令复杂的场景,也许你可以使用Runnable Object作为值。
另一种解决方法,可以使用Spring Shell.
@ShellMethod("commandName")
public String doSomething(String param) {
return String.format("Hi %s", param);
}