用 IntelliJ IDEA 中的等效方法替换 lambda 表达式

Replace lambda expression with equivalent method in IntelliJ IDEA

是否有 Intellij IDEA 重构可以用函数和函数引用替换 lambda 表达式?

我有:

List<String> convertToASlashBList(Collection<MyBean> beans) {
    return beans.stream().map(bean -> "" + bean.getA() + "/" + bean.getB()).collect(toList());
}

我要:

List<String> convertToASlashBList(Collection<MyBean> beans) {
    return beans.stream().map(this::convertToASlashB).collect(toList());
}

private String convertToASlashB(MyBean bean) {
    return "" + bean.getA() + "/" + bean.getB();
}

有提取匿名的重构class,但这实际上是不同的。

您可以转到该行并按 ALT+ENTER,也许他们会显示将其替换为其他选项的选项(可能会更改功能)。

我不知道你真正需要什么,但我在这里举了一个例子。

示例:

List<String> convertToASlashBList(Collection<MyBean> beans) {
  List<String> converted = new ArrayList<>();
  for (MyBean bean : beans) {
    converted.add(convertToASlashB(bean));
  }
  return converted;
}

private String convertToASlashB(MyBean bean) {
  return "" + bean.getA() + "/" + bean.getB();
}

您可以分两步完成:
1. select "" + bean.getA() + "/" + bean.getB() 部分并按 Cmd+Alt+M(提取方法)。这将创建您的方法并为您提供 beans.stream().map(bean -> convertToASlashB(bean)).collect(toList()).
2. 右键单击​​您的 lambda(它将变灰)并执行 'replace lambda with method reference'

IntelliJ IDEA 中的重构选项太多,很难找到正确的重构选项,甚至很难找到它驻留在 X 中的菜单)LinuxServers 答案的提示使我朝着正确的方向前进。

有两种选择:

  1. 将光标置于 lambda 并点击 ALT-ENTER 和 select "Extract to method reference"
  2. Select lambda 主体并执行重构 "Extract Method"(从主菜单或从重构此菜单或 CTRL-ALT-M),然后立即进行快速修复 ALT-ENTER "Replace lambda with method reference"