Java:带参数的可运行HashMap

Java:带参数的可运行HashMap,java,hashmap,runnable,args,Java,Hashmap,Runnable,Args,我需要制作一个包含一些参数的可运行HashMap (我正在编写一个游戏,我想:“当一个玩家输入一个特定的命令时,它会运行一个带有args的特定void,缓存在我的HashMap中。”) 代码(可能)比我更明确: 1=>制作命令列表的映射,每个键应运行: -myVoidWithArgs(arg1,arg2) -myOtherVoidWithArgs(arg1,arg2) -等等(arg1和arg2应为字符串) 我该怎么做?还有别的办法吗 谢谢因为Runnable需要两个参数,所以映射中的值不需要R

我需要制作一个包含一些参数的可运行HashMap

(我正在编写一个游戏,我想:“当一个玩家输入一个特定的命令时,它会运行一个带有args的特定void,缓存在我的HashMap中。”)

代码(可能)比我更明确:

1=>制作命令列表的映射,每个键应运行:

-myVoidWithArgs(arg1,arg2)

-myOtherVoidWithArgs(arg1,arg2)

-等等(arg1和arg2应为字符串)

我该怎么做?还有别的办法吗


谢谢

因为Runnable需要两个参数,所以映射中的值不需要
Runnable
接口。使用
BiConsumer
;然后你可以这样做:

Map<String, BiConsumer<String, String>> cmdList = new HashMap<>();

cmdList.put("teleport", (arg1, arg2) -> myVoidWithArgs(arg1, arg2));
cmdList.put("kill", (arg1, arg2) -> myOtherVoidWithArgs(arg1, arg2));
也可以使用方法引用而不是lambda来填充映射:

cmdList.put("teleport", SomeClass::myVoidWithArgs);
cmdList.put("kill", SomeClass::myOtherVoidWithArgs);

(假设方法是
SomeClass
static
方法;如果不是,则将
SomeClass
替换为对包含方法的对象的引用)。

由于可运行项需要两个参数,因此映射中的值不需要
Runnable
接口。使用
BiConsumer
;然后你可以这样做:

Map<String, BiConsumer<String, String>> cmdList = new HashMap<>();

cmdList.put("teleport", (arg1, arg2) -> myVoidWithArgs(arg1, arg2));
cmdList.put("kill", (arg1, arg2) -> myOtherVoidWithArgs(arg1, arg2));
也可以使用方法引用而不是lambda来填充映射:

cmdList.put("teleport", SomeClass::myVoidWithArgs);
cmdList.put("kill", SomeClass::myOtherVoidWithArgs);

(假设这些方法是
SomeClass
static
方法;如果不是,则将
SomeClass
替换为对包含这些方法的对象的引用)。

我没有尝试任何操作,因为我上面的代码不适用于参数。我需要这样的代码,谁可以工作,但是使用args..为什么不工作?有任何错误信息显示给我们吗?请特别阅读。请不要在这一边进行代码请求。它用于问答,代码请求不是问题。研究这个主题,设计你自己的解决方案,当你自己的解决方案不起作用时发布一个问题。我什么都没试过,因为我上面的代码不适用于args。我需要这样的代码,谁可以工作,但是使用args..为什么不工作?有任何错误信息显示给我们吗?请特别阅读。请不要在这一边进行代码请求。它用于问答,代码请求不是问题。研究这个主题,设计你自己的解决方案,当你自己的解决方案不起作用时发布一个问题。@Jasper他需要把这个值作为一个可运行的对象,而不是简单的双消费者。Runnable是一个简单的接口,它不接受任何参数,也不返回任何内容。所以这个值应该是Runnable@HasnainAliBohra从他的帖子中,我并没有这样理解:值必须是
可运行的
。如果这些方法需要两个参数,那么就无法将它们适配到
Runnable
接口
BiConsumer
非常类似于
Runnable
,只是它表示一个函数,它接受两个参数(而不是没有参数)并且什么也不返回。这正是我所需要的!干得好!非常感谢你们。@同意你们的观点。问题是他怎么能要求开始执行线程?新线程(cmdList.get(“teleport”).accept(“Player”、“coords”).start?@Jasper他需要将值作为可运行对象,而不是简单的双消费者。Runnable是一个简单的接口,它不接受任何参数,也不返回任何内容。所以这个值应该是Runnable@HasnainAliBohra从他的帖子中,我并没有这样理解:值必须是
可运行的
。如果这些方法需要两个参数,那么就无法将它们适配到
Runnable
接口
BiConsumer
非常类似于
Runnable
,只是它表示一个函数,它接受两个参数(而不是没有参数)并且什么也不返回。这正是我所需要的!干得好!非常感谢你们。@同意你们的观点。问题是他怎么能要求开始执行线程?新线程(cmdList.get(“teleport”).accept(“Player”、“coords”).start?
cmdList.put("teleport", SomeClass::myVoidWithArgs);
cmdList.put("kill", SomeClass::myOtherVoidWithArgs);