如何在 Java 中将匿名类替换为 lambda?

2022-08-31 15:30:26

我有这个代码,但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());
    }
}); 

答案 1

通常,类似如下:

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());
    }
);

请注意,仅当匿名类具有一个方法时,才可以将匿名类替换为 lambda。如果匿名类具有更多方法,则无法进行替换。

预言机文档

上一节“匿名类”介绍如何在不为其命名的情况下实现基类。尽管这通常比命名类更简洁,但对于只有一个方法的类,即使是匿名类似乎也有点过分和繁琐。Lambda 表达式可让您更紧凑地表达单方法类的实例


答案 2

为什么不让IntelliJ向您展示呢?将光标放在声明上,然后按 Alt + Enter(如果在 Mac 上,则按 Option + Enter)以显示意图弹出窗口。选择“替换为 lambda”,然后观看转换后的代码...


推荐