如何用 Java 中的 lambda 替换匿名 class?
How do I replace an anonymous class with a lambda in Java?
我有这段代码,但 IntelliJ 告诉我用 lambda 替换 anonymous 但我不知道怎么做。谁能帮我这个?
这是我的代码:
soundVolume.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> ov,
Number old_val, Number new_val) {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume());
}
});
它对可读性并没有真正帮助,但在这里它是。
请注意,main
的引用应该是最终的或有效的最终引用才能起作用。
soundVolume.valueProperty()
.addListener(
(ObservableValue<? extends Number> ov, Number old_val, Number new_val) -> {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume())
});
一般来说,是这样的:
methodUsingYourClass(new YourClass() {
public void uniqueMethod(Type1 parameter1, Type2 parameter2) {
// body of function
}
});
替换为
methodUsingYourClass((parameter1, parameter2) -> {
// body of function
});
参数的类型可以从用法中推断出来,但在某些情况下指定它们可能很有用。这部分来自上面的例子
(parameter1, parameter2) -> {
如果您决定明确指定类型,就会变成这样
(Type1 parameter1, Type2 parameter2) -> {
对于您的具体示例,您可以使用:
soundVolume.valueProperty().addListener(
(ov, old_val, new_val) -> {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume());
}
);
注意 仅当匿名 class 具有一种方法时,才有可能用 lambda 替换匿名 class。如果匿名 class 有更多的方法,那么替换是不可能的。
The previous section, Anonymous Classes, shows you how to implement a base class without giving it a name. Although this is often more concise than a named class, for classes with only one method, even an anonymous class seems a bit excessive and cumbersome. Lambda expressions let you express instances of single-method classes more compactly.
为什么不让 IntelliJ 向您展示?将光标放在声明上,然后按 Alt + Enter(如果在 Mac 上,则按 Option + Enter)以显示意图弹出窗口。选择 "Replace with lambda" 并观察转换后的代码...
为了代码清晰,您还可以使用 lambda 声明一个变量并将该变量传递给 addListener 方法。例如
soundVolume.valueProperty().addListener(listener);
ChangeListener<Number> listener = (observable, oldValue, newValue) -> { ... };
您只需右键单击发出警告的元素,等待黄色气球出现并选择(替换为 Lambda),Android Studio 会自动完成。
我有这段代码,但 IntelliJ 告诉我用 lambda 替换 anonymous 但我不知道怎么做。谁能帮我这个? 这是我的代码:
soundVolume.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> ov,
Number old_val, Number new_val) {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume());
}
});
它对可读性并没有真正帮助,但在这里它是。
请注意,main
的引用应该是最终的或有效的最终引用才能起作用。
soundVolume.valueProperty()
.addListener(
(ObservableValue<? extends Number> ov, Number old_val, Number new_val) -> {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume())
});
一般来说,是这样的:
methodUsingYourClass(new YourClass() {
public void uniqueMethod(Type1 parameter1, Type2 parameter2) {
// body of function
}
});
替换为
methodUsingYourClass((parameter1, parameter2) -> {
// body of function
});
参数的类型可以从用法中推断出来,但在某些情况下指定它们可能很有用。这部分来自上面的例子
(parameter1, parameter2) -> {
如果您决定明确指定类型,就会变成这样
(Type1 parameter1, Type2 parameter2) -> {
对于您的具体示例,您可以使用:
soundVolume.valueProperty().addListener(
(ov, old_val, new_val) -> {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume());
}
);
注意 仅当匿名 class 具有一种方法时,才有可能用 lambda 替换匿名 class。如果匿名 class 有更多的方法,那么替换是不可能的。
The previous section, Anonymous Classes, shows you how to implement a base class without giving it a name. Although this is often more concise than a named class, for classes with only one method, even an anonymous class seems a bit excessive and cumbersome. Lambda expressions let you express instances of single-method classes more compactly.
为什么不让 IntelliJ 向您展示?将光标放在声明上,然后按 Alt + Enter(如果在 Mac 上,则按 Option + Enter)以显示意图弹出窗口。选择 "Replace with lambda" 并观察转换后的代码...
为了代码清晰,您还可以使用 lambda 声明一个变量并将该变量传递给 addListener 方法。例如
soundVolume.valueProperty().addListener(listener);
ChangeListener<Number> listener = (observable, oldValue, newValue) -> { ... };
您只需右键单击发出警告的元素,等待黄色气球出现并选择(替换为 Lambda),Android Studio 会自动完成。