java - 不能将下划线作为参数的方法重构到 lambda 中吗?

标签 java android intellij-idea lambda java-8

<分区>

我有很多类只有一个方法(其中一半不使用它们的参数,因此将其命名为下划线),我刚切换到 Java 8。现在我想用 lambda 替换它们。

这是我的代码:

interface I {
  void stuffHappened(Integer howManyStuff);
}

public class A {
  void go() {
    I i = new I() {
      public void stuffHappened(Integer _) {
        System.out.println("woah!!");
      }
    };
  }
}

之后:

interface I {
  void stuffHappened(Integer howManyStuff);
}

public class A {
  void go() {
    I i = _ -> System.out.println("woah!!");
  }
}

如您所见,它显然不再有效,声称使用“_”作为参数名称不再有效。但是为什么它首先允许这种重构呢?为什么它适用于匿名类,而不适用于 lambda?这真的是新规定吗?或者是 IDEA 中的某种差异?

我正在使用 Intellij-IDEA(第一次使用它),实际上,Android Studio(测试版)0.8.1(使用 retrolambda 以允许在 android 上使用 lambda),我认为它使用了 IDEA。

最佳答案

在 Java 8 之前,单个下划线 _ 是有效的标识符。从 Java 8 开始,不允许使用下划线,以允许将来使用普通标识符以外的东西。看这个message from Brian Goetz求解释。

在现有(lambda 之前)代码中使用下划线将产生警告,但将下划线用作 lambda 形式参数名称将产生错误。正如 Brian 所说,“因为没有现成的 lambda 代码。”

在您的示例中,匿名内部类中的形式参数 _ 是合法代码,但它应该会生成警告。将此代码重构为使用 _ 的 lambda 将使其非法!由于 IntelliJ IDEA 正在重构此代码,它应该知道此规则,并且应该提供将参数名称重命名为其他名称。

在 IDEA 的重构机制中,这可能被视为一个错误,或者至少需要增强。

关于java - 不能将下划线作为参数的方法重构到 lambda 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24750576/

相关文章:

java - 处理 pojo 的设计模式

java - 需要帮助将 java.stream 转换为列表

android - 如何支持所有安卓屏幕尺寸?

android - GLES 3.0 包括 gl2ext.h

java - 错误 : Gradle: error: package javax. 邮件不存在

java - 我可以在 Android Studio 中调试时退回到之前的断点吗? (掉帧)

tomcat - 无法在 IntelliJ IDEA 中运行 Tomcat

java - 简单服务器客户端程序中的 EOF- 和 SocketException

java - (AES加密)代码缺陷,应该注意什么? [提供代码][Java]

android - 如何在android中通过蓝牙连接手机和打印机?