【问题标题】:Why does IntelliJ suggest to replace anonymous Runnables with Lambda Expressions?为什么 IntelliJ 建议用 Lambda 表达式替换匿名 Runnables?
【发布时间】:2019-06-24 14:49:54
【问题描述】:

IntelliJ IDEA 建议 Form 的可运行文件

findViewById(R.id.my_view).post(new Runnable() {
    @Override
    public void run() {
      Log.d("myTag", "hey");
    }
  });

替换为

findViewById(R.id.my_view).post(() -> Log.d("myTag", "hey"));

This Q&A covers the How.
但为什么后者更可取呢?

【问题讨论】:

标签: java


【解决方案1】:

一个 lambda 表达式创建一个不同的字节码,可以更轻。使用匿名类时,您告诉编译器创建一个附加类,以便稍后实例化和调用。

当使用 lambda 表达式时,你告诉编译器要么创建一个对象,要么创建一个合成方法。 在使用局部变量的情况下,编译器将创建一个对象并将捕获的变量传递给其构造函数,本质上是复制引用。 如果没有捕获任何变量,它只会创建一个私有静态方法。

此外,您还可以争辩说 lambda 看起来更具可读性。

【讨论】:

    【解决方案2】:

    这就是java的发展方式。在 java 8 中引入 lambda 使代码更简洁、更简洁。只计算代码行数

      @Override
        public void run() {
          Log.d("myTag", "hey");
        }
      });
    

    findViewById(R.id.my_view).post(() -> Log.d("myTag", "hey"));
    

    整个方法只需一行代码。并且代码的输出将与更长的代码相同。 你可以看看 Scala,在 Scala 中写 lambdas 和这么短的代码是很常见的。

    【讨论】:

      【解决方案3】:

      人们回答“但为什么后者更可取?”,但我会回答

      “为什么 IntelliJ 建议用 Lambda 替换匿名 Runnables 表达式?”

      是 Intellij 正在检查您设置的 project level language 并尝试建议您应该使用该语言版本进行编码的方式。您很可能将其设置为 8 或更高。

      要更改它,请转到Project structure (CTRL+ALT+SHIFT+S) -> Project 并将Project level language 更改为小于8。

      或者,如果您只需要特定模块,请再次进入Project structure,然后在Modules,单击您需要的模块,然后在Sources选项卡中,有一个Language level

      编辑:另外,看看这个帖子What is Project Language level in IntelliJ IDEA?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-11
        • 2013-04-24
        • 2011-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多