2014-11-26 12 views
10

Sto iniziando con le espressioni lambda in Java e c'è qualcosa che considero bizzarro e sono sicuro che sto facendo qualcosa di sbagliato o che ha una soluzione.Comparatore lambda multilinea

Per definire un comparatore, che posso fare:

col.setComparator((CustomCell o1, CustomCell o2) -> 
      ((Comparable) o1.getValue()).compareTo(o2.getValue()) 
     ); 

Che è grande, tuttavia, se ho solo aggiungere due "{". Ottengo un errore di compilazione:

col.setComparator((CustomCell o1, CustomCell o2) -> { 
      ((Comparable) o1.getValue()).compareTo(o2.getValue()); 
     }); 

L'errore non è correlato al "{", ma per setComparator:

The method setComparator(Comparator<CustomCell>) in the type 
TableColumnBase<CustomParentCell,CustomCell> is not applicable for the arguments 
((CustomCell o1, CustomCell o2) -> {}) 

Ho provato con le normative più righe prima per ActionEvents e lo fa di lavoro:

setOnAction(event -> { 
     // do something 
}); 

È perché ha solo un argomento?

risposta

19

Il metodo si implementa con setOnAction è

public void handleEvent(ActionEvent event) ; 

E 'un tipo di ritorno di void: vale a dire che non restituisce nulla:

Il metodo si implementa con setComparator è

public int compare(CustomCell cell1, CustomCell cell2) ; 

che restituisce un valore. Per utilizzare il modulo più lungo, è necessario avere un'istruzione di reso esplicita per i metodi che restituiscono un valore:

col.setComparator((CustomCell o1, CustomCell o2) -> { 
     return ((Comparable) o1.getValue()).compareTo(o2.getValue()); 
    }); 
+0

Grazie. Sì, questa è la ragione. L'errore che stavo ottenendo non era molto utile. – luanjot