当前位置: 首页 > 知识库问答 >
问题:

尝试在Java中使用lambdas进行小重构

秦渝
2023-03-14

我正在做一个程序的一部分(关于语音识别和遥控车),其中代码传输(XXXXX);disableAutoMode();重复多次。出于好奇,我想将其转换为类似于var f=p->transmitte(p)的lambda函数;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;
        }
    }
}

共有1个答案

魏冷勋
2023-03-14

一个更雄心勃勃的重构将建立在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);
    }
}
 类似资料:
  • 我尝试在我的活动中注入修改,但我得到了空异常 这是AndroidApplication类

  • 问题内容: 我正在运行Python 3.4.2,我对代码的行为感到困惑。我正在尝试创建递增次数的可调用多项式函数列表: 但是出于某种原因,它这样做: 为什么似乎在列表理解中重复了最后一个lambda表达式的列表? 问题答案: 这个问题是经典的“陷阱”,是在lambda函数被调用之前,不会查找lambda函数中引用的内容。当时的值是结束时绑定到的最后一个值,即。 如果绑定到函数定义中的默认值,则每个

  • 问题内容: 我正在尝试使用Eclipse作为IDE在计算机上调试简单的Java应用程序。当我尝试通过进入Debug Perspective调试应用程序时,我设置了一个断点并开始调试。在几秒钟内,将出现以下弹出窗口: 。 在控制台上转储的消息如下: 我该如何纠正?为什么会这样? 问题答案: 我只是有同样的问题。 昨天一切正常,现在什么都没有了-与您给出的错误相同。我发现网络管理员在此期间进行了一些更

  • 问题内容: 在我正在处理的项目中,我需要执行资源文件夹(位于类路径中)中的脚本。我只是在测试最终的脚本功能,因为我在Windows上,所以我需要一种将文件输出到STDIN的方法,因此我创建了一个简单的cat.jar程序来克隆unixs cat命令。 因此,当我执行“ java -jar cat.jar someFile.txt”时,它将输出文件到stdout。我敢肯定,我做的事情有不同的方式。 无

  • 问题内容: 如何在Java 8中执行类似的操作? 现在,我收到以下错误: 此表达式的目标类型必须是功能接口 问题答案: 根据JLS 第15.27节: 如果lambda表达式出现在程序中的某个环境中,而不是赋值上下文(第5.2节),调用上下文(第5.3节)或强制转换上下文(第5.5节),则这是编译时错误。 也可以在语句中使用lambda表达式。 然后,我们可以用四种不同的方式重写您的示例: 通过创建