2016-06-08 16 views
16

Ho questo codice ma IntelliJ mi dice di sostituire anonimo con lambda ma non so come. Qualcuno mi può aiutare con questo? Ecco il mio codice:come sostituire anonimo con lambda in 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

Voi sapete che questo è solo un suggerimento, giusto? – Kai

risposta

24

In generale, qualcosa di simile:

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

è sostituito con

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

Per il vostro codice specifico:

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

Nota la sostituzione di una classe anonima con lambda è possibile solo se la classe anonima ha un metodo. Se la classe anonima ha più metodi, la sostituzione non è possibile.

Da oracle documentation:

La sezione precedente, le classi anonime, vi mostra come implementare una classe di base senza dargli un nome. Sebbene questo sia spesso più conciso di una classe denominata, per le classi con un solo metodo, anche una classe anonima sembra un po 'eccessiva e ingombrante. Le espressioni lambda consentono di esprimere istanze di classi a metodo singolo in modo più compatto.

+2

È inoltre possibile saltare le dichiarazioni di tipo e liberarsi di alcune regole standard con qualcosa come '.addListener ((osservabile, oldValue, newValue) -> {...});' –

1

E non aiuta con la leggibilità ma qui lo è.

Si noti che il riferimento di main deve essere definitivo o effettivamente definitivo affinché funzioni.

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

Perché non lasciare che IntelliJ ti mostri? Posiziona il cursore sulla dichiarazione e premi Alt + Invio (o Opzione + Invio se su un Mac) per visualizzare il popup delle intenzioni. Scegli "Sostituisci con lambda" e guarda il codice trasformato ...

+3

A proposito; la stessa tecnica vale per la maggior parte dei suggerimenti, di solito permetto all'IDE di trasformare il codice per me se concordo con il suggerimento ... –

0

per la chiarezza del codice, puoi anche dichiarare una variabile con lambda e passare tale variabile al metodo addListener. per esempio

soundVolume.valueProperty().addListener(listener);

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