web-dev-qa-db-ja.com

javaの匿名をラムダに置き換える方法

私はこのコードを手に入れましたが、IntelliJはanonymousを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());
    }
}); 
45

一般的に、そのようなもの:

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

匿名クラスのラムダによる置換は、匿名クラスにメソッドが1つしかない場合にのみ可能です。匿名クラスにさらにメソッドがある場合、置換はできません。

Oracleドキュメント から:

前のセクション「匿名クラス」では、名前を付けずに基本クラスを実装する方法を示しました。多くの場合、これは名前付きクラスよりも簡潔ですが、メソッドが1つしかないクラスの場合、匿名クラスであっても少し過剰で扱いにくいように見えます。 ラムダ式を使用すると、単一メソッドクラスのインスタンスをよりコンパクトに表現できます

74

IntelliJに見せてみませんか?宣言の上にカーソルを置き、Alt + Enter(またはMacの場合はOption + Enter)を押して、意図のポップアップを表示します。 [ラムダで置換]を選択して、変換されたコードを確認します...

71
Per Huss

読みやすさにはあまり役立ちませんが、ここでは役立ちます。

mainの参照は、これが機能するために最終または実質的に最終でなければならないことに注意してください。

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

コードを明確にするために、ラムダを使用して変数を宣言し、その変数をaddListenerメソッドに渡すこともできます。例えば

soundVolume.valueProperty().addListener(listener);

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

1
Fahime Ghasemi

警告を与える要素を右クリックし、黄色のバルーンが表示されるまで待って(Lambdaに置き換え)選択すると、Android St​​udioが自動的に実行します。

0
Teri Beckham