我有这个代码,但IntelliJ告诉我用lambda取代匿名但我不知道如何。谁能帮我这个? 这是我的代码:
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());
}
});
答案 0 :(得分:66)
通常,类似的东西:
methodUsingYourClass(new YourClass() {
public void uniqueMethod(Type1 parameter1, Type2 parameter2) {
// body of function
}
});
替换为
methodUsingYourClass((Type1 parameter1, Type2 parameter2) -> {
// body of function
});
针对您的具体代码:
soundVolume.valueProperty().addListener(
(ObservableValue<? extends Number> ov,
Number old_val, Number new_val) -> {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume());
});
注意只有当匿名类有一个方法时才可以用lambda替换匿名类。如果匿名类有更多方法,则无法进行替换。
上一节“匿名类”向您展示了如何在不给它命名的情况下实现基类。虽然这通常比命名类更简洁,但对于只有一个方法的类,即使是匿名类也似乎有点过分和繁琐。 Lambda表达式允许您更紧凑地表达单方法类的实例。
答案 1 :(得分:62)
为什么不让IntelliJ告诉你?将光标放在声明上,然后按Alt + Enter(或选择+在Mac上输入)以显示意图弹出窗口。选择&#34;替换为lambda&#34;并观看转换后的代码...
答案 2 :(得分:1)
它对可读性没有任何帮助,但现在确实如此。
请注意main
的引用应该是最终的或有效的最终结果。
soundVolume.valueProperty()
.addListener(
(ObservableValue<? extends Number> ov, Number old_val, Number new_val) -> {
main.setSoundVolume(new_val.doubleValue());
main.getMediaPlayer().setVolume(main.getSoundVolume())
});
答案 3 :(得分:1)
为了清晰代码,您还可以使用lambda声明变量并将该变量传递给addListener方法。例如
soundVolume.valueProperty().addListener(listener);
ChangeListener<Number> listener = (observable, oldValue, newValue) -> { ... };
答案 4 :(得分:0)
您可以右键单击发出警告的元素,等到出现黄色气球并选择(用Lambda替换),然后Android Studio会自动执行。