usar son que las interfaces instrucciones funcionales expresiones explicacion como java lambda anonymous

son - java 8 lambda explicacion



cómo reemplazar anónimo con lambda en java (4)

¿Por qué no dejas que te muestre IntelliJ? Coloque el cursor en la declaración y presione Alt + Intro (u Opción + Intro si está en una Mac) para que aparezca la ventana emergente de intenciones. Elija "Reemplazar con lambda" y observe el código transformado ...

Tengo este código pero IntelliJ me dice que reemplace el anónimo con lambda pero no sé cómo. ¿Puede alguien ayudarme con esto? Aquí está mi código:

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


En general, algo así:

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

se sustituye por

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

Para su código específico:

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

Tenga en cuenta que el reemplazo de una clase anónima con lambda es posible solo si la clase anónima tiene un método. Si la clase anónima tiene más métodos, la sustitución no es posible.

De la documentación de oracle :

La sección anterior, Clases anónimas, muestra cómo implementar una clase base sin darle un nombre. Aunque a menudo esto es más conciso que una clase nombrada, para las clases con un solo método, incluso una clase anónima parece un poco excesiva e incómoda. Las expresiones Lambda le permiten expresar instancias de clases de un solo método de forma más compacta .


Realmente no ayuda con la legibilidad pero aquí está.

Tenga en cuenta que la referencia main debe ser definitiva o efectiva para que esto funcione.

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


para mayor claridad del código, también puede declarar una variable con lambda y pasar esa variable al método addListener. por ejemplo

soundVolume.valueProperty().addListener(listener);

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