Как заменить анонимный лямбда в java

У меня есть этот код, но IntelliJ говорит мне заменить анонимный лямбдой, но я не знаю, как это сделать. Кто-нибудь может мне с этим помочь? Вот мой код:

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

Ответы

Ответ 1

Как правило, что-то вроде этого:

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

Примечание замена анонимного класса на лямбда возможна только в том случае, если у анонимного класса есть один метод. Если у анонимного класса больше методов, замена невозможна.

Из документация оракула:

В предыдущем разделе Анонимные классы показано, как реализовать базовый класс без указания имени. Хотя это часто более кратким, чем именованный класс, для классов только с одним методом даже анонимный класс кажется немного чрезмерным и громоздким. Лямбда-выражения позволяют более гибко выражать экземпляры классов с одним методом.

Ответ 2

Почему бы вам не показать IntelliJ? Поместите курсор на объявление и нажмите Alt + Enter (или Option + Enter, если на Mac), чтобы открыть всплывающее окно. Выберите "Заменить с помощью лямбда" и просмотрите преобразованный код...

Ответ 3

Это не помогает с читабельностью, но вот оно.

Обратите внимание, что ссылка main должна быть окончательной или эффективной для этого.

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

Ответ 4

для ясности кода вы также можете объявить переменную с помощью лямбды и передать эту переменную в метод addListener. например

soundVolume.valueProperty().addListener(listener);

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

Ответ 5

Вы можете просто щелкнуть правой кнопкой мыши на элементе, который выдает предупреждение, подождать, пока не появится желтый шарик, и выбрать (заменить на Lambda), и Android Studio сделает это автоматически.