我正在开发一个程序的一部分(关于语音识别和遥控汽车),其中代码 transmit(XXXXX); disableAutoMode();
重复多次。出于好奇,我想将其转换为类似于此的 lambda 函数 var f = p -> transmit(p); disableAutoMode();
(原谅 var
;我不知道表达式的类型是什么),然后以类似于这样的方式调用它: f("s");
, f("a");
和f("f");
或类似于f.call("s");
的东西, f.call("a");
和f.call("f");
.
在 Java 中使用类似于我上面描述的简单 lambda 函数的正确语法是什么? (我应该写下什么,因为它的类型而不是说 var
?)
如果您好奇的话,这是代码块:
@Override
public void onResult(Hypothesis hypothesis) {
if (hypothesis != null) {
String text = hypothesis.getHypstr();
Log.i("onresult",text);
ToastMaster(text);
switch (text) {
case "forward":
case "go forward":
transmit("f");
disableAutoMode();
break;
case "go back":
case "go backward":
case "back":
case "backward":
case "reverse":
transmit("b");
disableAutoMode();
break;
case "skid left":
case "go left":
transmit("l");
disableAutoMode();
break;
case "skid right":
case "go right":
transmit("r");
disableAutoMode();
break;
case "turn left":
transmit("q");
disableAutoMode();
break;
case "turn right":
transmit("e");
disableAutoMode();
break;
case "reverse left":
transmit("z");
disableAutoMode();
break;
case "reverse right":
transmit("x");
disableAutoMode();
break;
case "stop":
disableAutoMode();
break;
case "automatic":
toggleAutoMode(null);
break;
case "enable automatic mode":
enableAutoMode();
break;
case "disable automatic mode":
disableAutoMode();
break;
}
}
}
最佳答案
更雄心勃勃的重构将建立在 lambda 所涉及的“将代码转换为数据”原则的基础上,将 switch 语句从代码转换为数据。怎么样:
// One-time setup of the machine
Map<String, Consumer<String>> actions = new HashMap<>();
actions.put("go forward", x -> { transmit(x); disableAutoMode(); });
actions.put(...)
...
public void onResult(Hypothesis hypothesis) {
if (hypothesis != null) {
String text = hypothesis.getHypstr();
Log.i("onresult",text);
ToastMaster(text);
Consumer<String> action = actions.get(text);
if (action != null)
action.accept(text);
}
}
关于java - 尝试在 Java 中使用 lambda 进行小规模重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35593146/