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

新手上路,请多包涵

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

原文由 yukashima huksay 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 354
2 个回答

一般来说,是这样的:

 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 替换匿名类。如果匿名类有更多的方法,那么替换是不可能的。

来自 oracle 文档

上一节匿名类向您展示了如何在不给基类命名的情况下实现基类。虽然这往往比命名类更简洁,但对于只有一个方法的类来说,即使是匿名类也显得有些多余和繁琐。 Lambda 表达式让您可以更紧凑地表达单一方法类的实例

原文由 Davide Lorenzo MARINO 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 Per Huss 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题