2014-11-26 10 views
10

Zaczynam od wyrażeń lambda w języku Java i jest coś, co uważam za dziwaczne i jestem pewien, że robię coś nie tak, lub ma to obejście.Kompilator wieloliniowy do porównania lambda

Aby zdefiniować komparator, mogę zrobić:

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

Który jest wielki, jeśli jednak po prostu dodać dwa "{". I pojawia się błąd kompilacji:

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

Błąd nie jest związany z "{", ale setComparator:

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

Próbowałem za pomocą multilinii oświadczenia przed dla actionevents i to działa:

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

Czy to dlatego, że ma tylko jeden argument?

Odpowiedz

19

Sposób implementowania z setOnAction jest

public void handleEvent(ActionEvent event) ; 

To rodzaj powrotu void: czyli nie zwraca niczego:

Sposób implementowania z setComparator jest

public int compare(CustomCell cell1, CustomCell cell2) ; 

która zwraca wartość. Aby użyć dłuższego formularza, musisz mieć wyraźną instrukcję return dla metod zwracających wartość:

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

Dziękuję. Tak, to jest powód. Błąd, który otrzymałem, nie był zbyt pomocny. – luanjot

Powiązane problemy