当前位置: 首页 > 知识库问答 >
问题:

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

林建本
2023-03-14

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

共有2个答案

东郭远航
2023-03-14

为什么不让IntelliJ给你看?将光标放在声明上,然后按Alt+Enter键(如果在Mac上,则按Option+Enter键)弹出意图。选择“替换为lambda”,观看转换后的代码……

微生新翰
2023-03-14

通常,类似这样的东西:

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表达式使您可以更紧凑地表达单方法类的实例。

 类似资料:
  • 问题内容: 我在Java 8映射操作中传递了一个Function,Intellij告诉我可以将其替换为lambda表达式。但是我不知道如何在不创建中间对象结构的情况下做到这一点。 这是我的工作: 我认为Intellij建议我这样做: 我不知道一种干净的方法来获取在匿名函数中检索到的objectType.getTempUrl()。getFullUrl()部分,有什么建议吗? 问题答案: 你总是可以写

  • 我在JavaFX上有一个应用程序。在这个应用程序中,我需要实现专栏的编辑器。在旧版本中,该代码运行良好: 但是当我试图用lambda重写代码时 我得到一个错误:错误:java:不兼容的类型:lambda表达式中的不兼容参数类型告诉我如何指定lambda表达式的类型?

  • 当您编写一个匿名可运行文件时,例如: IntelliJ建议将其替换为以下lambda: 这到底是怎么工作的?特别是: 使用的构造函数仍然是,但lambda中没有任何内容表明它是可运行的。 为什么突然不再需要了?

  • 编译工作正常,但在运行时应用程序崩溃,出现以下错误:。 和缺少了什么?

  • 问题内容: 我试图将字符串分成数组并替换为,但无法做到,我也尝试了String.replaceAll这样的东西。 我想提供一个通往JNI的路径,并且它只能以这种方式读取。 问题答案: 在这种情况下不要使用- 这是用正则表达式指定的,这意味着您需要更多的转义。这应该很好: 请注意,由于Java字符串文字中的原因,反斜杠加倍-因此此处涉及的 实际 字符串是“单反斜杠”和“双反斜杠”-而不是双倍和四倍。

  • 问题内容: Java中匿名类的用途是什么?我们可以说使用匿名类是Java的优势之一吗? 问题答案: 使用某些“额外”(例如覆盖方法)创建对象的实例时,匿名内部类会变得很有用,而不必实际继承一个类。 我倾向于将它用作附加事件侦听器的快捷方式: 使用此方法可以使编码更快一些,因为我不需要创建额外的类来实现我可以实例化一个匿名内部类而无需实际创建单独的类。 我仅将这种技术用于“快速而肮脏的”任务,在这些