2016-06-08 31 views
16

Mam ten kod, ale IntelliJ mówi mi, aby zastąpić anonimowy lambda, ale nie wiem jak. Czy ktoś może mi w tym pomóc? Oto mój kod:jak zamienić anonimowy na lambda w java

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

Wiesz, że jest to tylko sugestia, prawda? – Kai

Odpowiedz

24

Generalnie coś takiego:

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

otrzymuje z

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

dla danego kodu:

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

Uwaga zastąpienie anonimowej klasy lambdą jest możliwe tylko wtedy, gdy anonimowa klasa ma jedną metodę. Jeśli klasa anonimowa ma więcej metod, zastąpienie nie jest możliwe.

Od oracle documentation:

poprzedniej części, anonimowych klasy, pokazuje jak zaimplementować klasę bazową, nie dając mu nazwę. Chociaż jest to często bardziej zwięzłe niż klasa nazwana, dla klas z jedną tylko metodą, nawet klasa anonimowa wydaje się nieco nadmierna i kłopotliwa. Wyrażenia lambdy pozwalają wyrażać wystąpienia klas jednomodowych bardziej zwięzłe.

+2

Możesz także pominąć deklaracje typu i pozbyć się jakiegoś szablonu z czymś takim jak '.addListener ((obserwowalna, stara wartość, nowa wartość) -> {...});' –

1

To naprawdę nie pomaga z czytelnością ale tutaj jest.

Należy pamiętać, że odniesienie main powinno być ostateczne lub skuteczne, aby mogło to zadziałać.

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

Dlaczego nie pozwolić, aby IntelliJ Ci pokazał? Umieść kursor na deklaracji i naciśnij Alt + Enter (lub Option + Enter, jeśli na komputerze Mac), aby wywołać wyskakujące okno intencji. Wybierz "Zamień na lambda" i obejrzyj przekształcony kod ...

+3

Przy okazji; ta sama technika dotyczy większości sugestii, zwykle pozwalam, aby IDE przekształciło kod dla mnie, jeśli zgodzę się z sugestią ... –

0

dla przejrzystości kodu, możesz również zadeklarować zmienną z lambda i przekazać tę zmienną do metody addListener. na przykład

soundVolume.valueProperty().addListener(listener);

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