如何在java中用lambda替换匿名

yuk*_*say 48 java lambda anonymous

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

Dav*_*INO 80

通常,类似的东西:

methodUsingYourClass(new YourClass() {
    public void uniqueMethod(Type1 parameter1, Type2 parameter2) {
        // body of function
    }
});
Run Code Online (Sandbox Code Playgroud)

被替换为

methodUsingYourClass((Type1 parameter1, Type2 parameter2) -> {
    // body of function
});
Run Code Online (Sandbox Code Playgroud)

对于您的特定代码:

soundVolume.valueProperty().addListener(
       (ObservableValue<? extends Number> ov,
                 Number old_val, Number new_val) -> {
    main.setSoundVolume(new_val.doubleValue());
    main.getMediaPlayer().setVolume(main.getSoundVolume());
});
Run Code Online (Sandbox Code Playgroud)

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

oracle文档:

上一节"匿名类"向您展示了如何在不给它命名的情况下实现基类.虽然这通常比命名类更简洁,但对于只有一个方法的类,即使是匿名类也似乎有点过分和繁琐.Lambda表达式允许您更紧凑地表达单方法类的实例.

  • 你也可以跳过类型声明,并删除一些类似`.addListener((observable,oldValue,newValue) - > {...})的样板文件; (5认同)

Per*_*uss 75

为什么不让IntelliJ告诉你?将光标放在声明上,然后按Alt + Enter(或选择+在Mac上输入)以显示意图弹出窗口.选择"替换为lambda"并观看转换后的代码......

  • 顺便说说; 相同的技术适用于大多数建议,如果我同意建议,我通常会让IDE为我转换代码... (5认同)

Fah*_*emi 8

为了使代码清晰,还可以使用lambda声明一个变量,然后将该变量传递给addListener方法。例如

soundVolume.valueProperty().addListener(listener);

ChangeListener<Number> listener = (observable, oldValue, newValue) -> { ... };