2017-07-31 72 views
0

我需要製作一個帶有一些參數的可運行HashMap。Java:帶參數的可運行HashMap

(我編碼一個遊戲,我想:「當一名球員進入一個特定的命令它的運行與ARGS一個比空隙,緩存在我的HashMap中。」)

的代碼將是(也許)比我更明確:

1 =>製作地圖的命令列表中,每個鍵應該運行:

- 「myVoidWithArgs(ARG1,ARG2)」

- 「myOtherVoidWithArgs(arg1,arg2)」

-etc。 (ARG1 & ARG2應弦)

HashMap<String, Runnable> cmdList = new HashMap<>(); 
cmdList.put("teleport",() -> myVoidWithArgs(arg1, arg2)); 
cmdList.put("kill",() -> myOtherVoidWithArgs(arg1, arg2)); 

2 =>後來,在一個又一個空白,得到的命令是這樣的:

cmdList.get("teleport").run("Player", "coords"); 
cmdList.get("kill").run("Player", "Message"); 

我怎麼能這樣做?還有另一種方法可以做到嗎?

感謝

+0

你到目前爲止嘗試過什麼? –

+0

我沒有試過,因爲我上面的代碼不能和args一起工作。 我需要這種代碼,誰工作,但與args .. –

+0

爲什麼它不工作?任何錯誤信息向我們展示? – Asew

回答

4

由於可運行需要兩個參數,Runnable接口是不是你需要在地圖中的值。改爲使用BiConsumer<String, String>;那麼你可以這樣做:

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

cmdList.put("teleport", (arg1, arg2) -> myVoidWithArgs(arg1, arg2)); 
cmdList.put("kill", (arg1, arg2) -> myOtherVoidWithArgs(arg1, arg2)); 

你可以叫他們這樣的:

cmdList.get("teleport").accept("Player", "coords"); 
cmdList.get("kill").accept("Player", "Message"); 

您還可以使用方法引用的,而不是lambda表達式來填補你的地圖:

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

(假設方法是static方法SomeClass;如果不是,則將SomeClass替換爲包含方法的對象的引用)。

+0

@Jasper他需要將該值作爲Runnable Object而不是簡單的BiConsumer。 Runnable是簡單的界面,不需要任何參數,也不會返回任何內容。所以這個值應該是可運行的 –

+0

@HasnainAliBohra從他的文章中,我不認爲它是一個硬性要求,該值需要是'Runnable'。如果這些方法需要兩個參數,那麼就沒有辦法使它們適合'Runnable'接口。 'BiConsumer'很像'Runnable',不同之處在於它代表一個帶有兩個參數(而不是無參數)並且什麼都不返回的函數。 – Jesper

+0

正是我需要的!太棒了!非常感謝。 –