如何在java中用lambda替换匿名

时间:2016-06-08 07:05:32

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

5 个答案:

答案 0 :(得分:66)

通常,类似的东西:

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

替换为

methodUsingYourClass((Type1 parameter1, Type2 parameter2) -> {
    // body of function
});

针对您的具体代码:

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

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

来自oracle documentation

  

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

答案 1 :(得分:62)

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

答案 2 :(得分:1)

它对可读性没有任何帮助,但现在确实如此。

请注意main的引用应该是最终的或有效的最终结果。

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

答案 3 :(得分:1)

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

soundVolume.valueProperty().addListener(listener);

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

答案 4 :(得分:0)

您可以右键单击发出警告的元素,等到出现黄色气球并选择(用Lambda替换),然后Android Studio会自动执行。