Hoe vervang ik een anonieme klasse door een lambda in Java?

Ik heb deze code, maar IntelliJ zegt dat ik anoniem moet vervangen door lambda, maar ik weet niet hoe. kan iemand mij hiermee helpen?
Hier is mijn code:

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

Antwoord 1, autoriteit 100%

Over het algemeen zoiets als dit:

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

wordt vervangen door

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

De typen parameters kunnen worden afgeleid uit het gebruik, maar er kunnen situaties zijn waarin het nuttig is ze te specificeren. Dit deel uit het bovenstaande voorbeeld

(parameter1, parameter2) -> {

zou dit worden, als u besluit de typen expliciet op te geven

(Type1 parameter1, Type2 parameter2) -> {

Voor uw specifieke voorbeeld kunt u het volgende gebruiken:

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

Opmerkingde vervanging van een anonieme klasse door lambda is alleen mogelijk als de anonieme klasse één methode heeft. Als de anonieme klasse meer methoden heeft, is de vervanging niet mogelijk.

Van de orakeldocumentatie:

De vorige sectie, Anonieme klassen, laat zien hoe u een basisklasse implementeert zonder deze een naam te geven. Hoewel dit vaak beknopter is dan een benoemde klasse, lijkt voor klassen met slechts één methode zelfs een anonieme klasse een beetje overdreven en omslachtig. Met Lambda-expressies kunt u instanties van klassen met één methode compacter uitdrukken.


Antwoord 2, autoriteit 74%

Waarom laat je IntelliJ het je niet zien? Plaats uw cursor op de aangifte en druk op Alt + Enter (of Option + Enter als op een Mac) om de pop-up met intenties te openen. Kies “Vervangen door lambda” en bekijk de getransformeerde code…


Antwoord 3, autoriteit 8%

voor de duidelijkheid van de code kun je ook een variabele declareren met lambda en die variabele doorgeven aan de addListener-methode. bijvoorbeeld

soundVolume.valueProperty().addListener(listener);

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


Antwoord 4, autoriteit 2%

Je kunt gewoon met de rechtermuisknop op het element klikken dat je de waarschuwing geeft, wachten tot de gele ballon verschijnt en kiezen (vervangen door Lambda) en Android Studio zal het automatisch doen.


Antwoord 5

Het helpt niet echt met de leesbaarheid, maar hier is het dan.

Houd er rekening mee dat de referentie van maindefinitief of effectief definitief moet zijn om dit te laten werken.

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

Other episodes