2016-07-06 3 views
3

Я пытаюсь объявить HashMap, который возьмет строку и вернет Callable.Правильный способ объявления лямбда внутри HashMap

у меня есть:

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

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

где прибудет это функция, которая возвращает ничтожной.

Но я получаю

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

Почему ожидает функция возвращает строку? Я хочу передать лямбда a String и получить void назад.

ответ

5

A Callable<String> имеет метод, который возвращает String (V call() throws Exception), поэтому вы не можете использовать лямбда с типом возврата пустоты. Вместо этого вы можете использовать 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> как значение в вашей карте будет:

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

Это происходит потому, что функциональный интерфейс Callable<T> имеет единственный метод, возвращающий значение T.