web-dev-qa-db-fra.com

comment remplacer anonyme par lambda dans 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());
    }
}); 
45
yukashima huksay

Généralement, 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 spécifique:

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 par lambda n'est possible que si la classe anonyme a une méthode. Si la classe anonyme a plus de méthodes, la substitution n'est pas possible.

De documentation Oracle :

La section précédente, Classes anonymes, explique comment implémenter une classe de base sans lui donner de nom. Bien que cela soit souvent plus concis qu'une classe nommée, pour les classes avec une seule méthode, même une classe anonyme semble un peu excessive et lourde. Les expressions Lambda vous permettent d'exprimer les instances de classes à méthode unique de manière plus compacte .

74

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

71
Per Huss

Cela n’aide pas vraiment la lisibilité, mais le voici.

Notez que la référence de main devrait être finale ou effective 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())
           });
1
Yassin Hajaj

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

soundVolume.valueProperty().addListener(listener);

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

1
Fahime Ghasemi

Vous pouvez simplement cliquer avec le bouton droit de la souris sur l'élément qui vous avertit, attendre que la bulle jaune apparaisse et choisir (remplacer par Lambda) et Android Studio le fera automatiquement.

0
Teri Beckham