Как заменить анонимный лямбда в 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 сделает это автоматически.