2016-07-06 7 views
3

HashMapを宣言しようとしています。これは文字列を受け取り、Callableを返します。HashMap内でラムダを宣言する正しい方法

私が持っている:

Map<String, Callable<String>> commands = new HashMap<>(); 

commands.put("get", (String item) -> get(item)); 

GETはvoidを返す関数です。

しかし、私はなぜそれが文字列を返すように機能を期待している

"Bad return type in Lambda expression: Void cannot be converted into a string." 

を取得していますか?私はラムダにStringを渡し、voidを返そうとしています。

答えて

5

Callable<String>には、StringV call() throws Exception)を返すメソッドがあるため、void戻り型のラムダは使用できません。代わりにConsumer<String>を使用できます。

Map<String, Consumer<String>> commands = new HashMap<>(); 

commands.put("get", (String item) -> get(item)); 
+1

これはコンパイルされません。 – Mena

+0

うわー、それは速かった。ありがとう。それは「電話」よりも「受け入れる」と呼ばれています。私はJavaを学んでいますが、Pythonに慣れていたので、機能的なパラダイムが私を壁に追いやっています。 – bencollier

+0

@Menaそれは、 'get()'がどのように定義されているかによって決まりますが、質問には指定されていません。例えば、あなたが 'public static void get(String g){}'を持っている場合、それはコンパイルされます。私はちょうどそれをテストした。 – Eran

0

あなたのマップに値としてCallable<String>のラムダ表現を置くための正しい構文は次のようになります。機能インタフェースCallable<T>T値を返す単一のメソッドを持っているためである

Map<String, Callable<String>> commands = new HashMap<>(); 
commands.put("get",() -> "some value"); 

関連する問題