尝试在Java中使用lambdas做一个小型重构

The*_*kle 2 java lambda anonymous-methods anonymous-function java-8

我正在研究程序的一部分(关于语音识别和遥控车),其中代码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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*etz 8

更加雄心勃勃的重构将建立在lambdas所关注的"将代码转换为数据"原则的基础上,将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,那也没关系.高位是"把这大包代码变成一包数据". (5认同)
  • 顺便问一下,您如何看待`actions.getOrDefault(text,x - > {}).接受(文本)`?这合理吗? (2认同)