java - 尝试在 Java 中使用 lambda 进行小规模重构

标签 java lambda java-8 anonymous-function anonymous-methods

我正在开发一个程序的一部分(关于语音识别和遥控汽车),其中代码 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/

相关文章:

java - google eclipse插件创建的log4j.properties和logging.properties有什么区别?

java - 如何从类路径加载/引用文件作为 File 实例

java - Spring Boot 启用 http/2 协议(protocol)

c++ - 在类中存储 Lambda

java - 为什么在 Java8 中将最小粒度定义为 8192 以便从并行排序切换到 Arrays.sort 而不管数据类型

java - 如何使用 Simple Formatter 修改日志格式?

java - 变量已在方法 lambda 中定义

sql - Linq lambda 表达式 (GROUP_CONCAT/STRING_AGG) 中 XML PATH 和 Stuff 的等价物是什么?

java - 凯撒密码在 Java 中被错误解码

classpath - 无法从类路径加载 jks 文件