65 votes

comment remplacer anonyme par lambda en java

J'ai ce code mais IntelliJ me dit de remplacer anonyme par lambda mais je ne sais pas comment. Est-ce que quelqu'un peut m'aider avec ça? Voici mon 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());
    }
}); 
 

114voto

Davide Lorenzo MARINO Points 9334

En général, quelque chose comme ça:

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

est remplacé par

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

Pour votre code:

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

Remarque le remplacement d'une classe anonyme lambda n'est possible que si la classe anonyme a une méthode. Si la classe anonyme a plus de méthodes de substitution n'est pas possible.

À partir de la documentation d'oracle:

La section précédente, Anonyme Classes, vous montre comment implémenter une classe de base sans lui donner un nom. Bien que ce est souvent plus concis qu'une classe nommée, pour les classes avec seulement une méthode, voire une classe anonyme semble un peu excessif et trop lourd. Les expressions Lambda, vous permettent d'exprimer les instances de la seule méthode de classes de manière plus compacte.

82voto

Per Huss Points 2530

Pourquoi ne pas laisser IntelliJ vous montrer? Placez votre curseur sur la déclaration et appuyez sur Alt + Entrée (ou Option + Entrée si sur un Mac) pour afficher la fenêtre d'intentions. Choisissez "Remplacer par lambda" et regardez le code transformé ...

9voto

Fahime Ghasemi Points 26

pour la clarté du code, vous pouvez également déclarer une variable avec lambda et passer cette variable à la méthode addListener. par exemple

soundVolume.valueProperty().addListener(listener);

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

2voto

Yassin Hajaj Points 4659

Cela n'aide pas vraiment avec la lisibilité mais le voici.

Notez que la référence de main doit être définitive ou effectivement définitive pour que cela fonctionne.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X