提取/引入变量
如果您遇到难以理解的表达式,或者该表达式在代码中的多个位置重复出现, 提取变量重构 Ctrl+Alt+V 可以帮助您解决这些问题,将该表达式或其中一部分的结果放入一个更简单、更易于理解的独立变量中。 另外,它减少了代码重复。
从 Java 1.8 及更高版本开始,IntelliJ IDEA 还允许您 提取一个功能类型变量。
如果您的 Java 版本支持 模式匹配 (Java 14 预览版或更高版本),并且您正在提取 instanceof 检查下的强制转换表达式,IntelliJ IDEA 可能会在该 instanceof 检查中引入一个模式变量,而不是普通的局部变量。 此外,您可以从 Java 14 版本开始内联模式变量。 在这种情况下,所有的出现都将被替换为 old-style cast expression。
您可以使用 引入变量重构将可变参数提取为新的切片变量。
在编辑器中,选择您要提取的表达式或其一部分。 您还可以将文本光标放在表达式内,在这种情况下,IntelliJ IDEA 会为您提供一个潜在代码选择列表。
按 Ctrl+Alt+V 或转到主菜单中的 。
或者, 在出现的 工具栏上,点击 提取 并选择 变量。
IntelliJ IDEA 还会在变量旁边显示
,您可以使用它来配置更多选项。

如果 IntelliJ IDEA 找到多个匹配项,您可以指定范围,仅提取找到的部分匹配项,而不是全部。

在弹出窗口中选择一个建议的名称或输入自己的名称,然后按 Enter。

您还可以将您提取的变量声明为
final。如果您想要将现有变量重新分配给新的变量,请按 Ctrl+Alt+V。 如果您有多个现有变量,IntelliJ IDEA 将显示一个供选择的列表。
您可以按 Shift+Tab 来更改变量的类型。

默认情况下,此提取重构将在编辑器中应用。 要更改您的设置以通过 模态窗口应用重构,请打开 设置 对话框(Ctrl+Alt+S ),转到 编辑器 | 代码编辑 ,并在 重构 区域选择 在模态对话框中。
示例
我们来提取代码中两次出现的 anotherClass.inValue() 变量并为其命名 number。
之前 | 之后 |
|---|---|
public void method() {
int a = 1;
...
int b = a + anotherClass.intValue();
int c = b + anotherClass.intValue();
}
|
public void method() {
int a = 1;
...
int number = anotherClass.intValue();
int b = a + number;
int c = b + number;
}
|
之前 | 之后 |
|---|---|
func method() {
val a = 1
val b = a + anotherClass!!.intValue()
val c = b + anotherClass!!.intValue()
}
|
func method() {
val a = 1
val number = anotherClass!!.intValue()
val b = a + number
val c = b + number
}
|
提取函数变量
此重构为 Java 1.8 及更高版本创建了函数表达式,为较旧版本的 Java 创建了匿名类。
选择代码片段,在本例中是
println方法的参数。
在主菜单中,前往 。
IntelliJ IDEA 打开 提取功能变量 对话框。
或者,您也可以从编辑器中的上下文菜单中选择 Ctrl+Alt+Shift+T ,然后选择 功能变量。

当所选代码依赖于实例字段时,例如在此示例中,会出现 将字段作为参数传递 复选框,您可以在字段位置传递一个参数。

但是,例如,如果您选择的代码片段依赖于任何局部变量或参数

相应的条目会出现在列表中。

当您在对话框中取消选择某个参数时,将使用相应的局部值。

配置您的选项然后点击 OK。
从弹出菜单中选择适用的函数式接口。

如果您愿意,可以更改提取变量的名称,若您不想使用列表中建议的名称。

IntelliJ IDEA 创建了可供您进一步使用的 lambda。

示例
之前 | 之后 |
|---|---|
import java.util.List;
public class PrintAction implements Runnable {
private List<String> data;
public PrintAction(List<String> data) {
this.data = data;
}
public void run() {
System.out.println("Data: " + data.toString());
}
}
|
import java.util.List;
import java.util.function.Function;
public class PrintAction implements Runnable {
private List<String> data;
public PrintAction(List<String> data) {
this.data = data;
}
public void run() {
Function<List<String>, String> presenter = (p) -> "Data: " + p.toString();
System.out.println(presenter.apply(data));
}
}
|