如何用 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 oracle documentation

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 会自动完成。