2015-07-30 4 views
1

Я следую примеру в ответе на JavaFX TableView Sort Policy, чтобы сделать свой собственный компаратор, но лямбда-выражения новы для меня, и мне трудно понять, что происходит.Java: проблема с объявлением локальной переменной lambda

Что работает некрасиво:

elementsTable.sortPolicyProperty().set(t -> { 
     Comparator<Row> comparator = (r1, r2) 
      -> of.wrap.els.getElement(toZ(r1.getSymbol())).getZ() > 
        of.wrap.els.getElement(toZ(r2.getSymbol())).getZ() ? 1 
      : of.wrap.els.getElement(toZ(r1.getSymbol())).getZ() < 
        of.wrap.els.getElement(toZ(r2.getSymbol())).getZ() ? -1 
      : of.wrap.els.getElement(toZ(r1.getSymbol())).getZ() == 
        of.wrap.els.getElement(toZ(r2.getSymbol())).getZ() ? 0 
      : t.getComparator() == null ? 0 //no column sorted: don't change order 
      : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly 
      FXCollections.sort(elementsTable.getItems(), comparator); 
     return true; 
    }); 

Но если я пытаюсь

int n1,n2; 
    elementsTable.sortPolicyProperty().set(t -> { 
     Comparator<Row> comparator = (r1, r2) 
      -> 
      n1 = of.wrap.els.getElement(toZ(r1.getSymbol())).getZ(); 
      n2 = of.wrap.els.getElement(toZ(r2.getSymbol())).getZ(); 
      n1 > n2 ? 1 
      : n1 < n2 ? -1 
      : n1 == n2 ? 0 
      : t.getComparator() == null ? 0 //no column sorted: don't change order 
      : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly 
      FXCollections.sort(elementsTable.getItems(), comparator); 
     return true; 
    }); 

NetBeans показывает, что r2 не используется в компараторе, и все экземпляры r1 и r2 помечаются как определено в области видимости , за исключением первого r1 как части n1.

Если я пытаюсь объявить n1, n2 внутренне как int, то он дает «.class» ожидается, или -> становится незаконным началом выражения, если оно окончательно.

Каков правильный способ делать то, что я пытаюсь?

+2

need '{}' '(params) -> {statements}' – ZhongYu

ответ

2

Вы не можете назначить переменные вне области лямбды-выражения, и вы должны поместить несколько операторов в скобках:

elementsTable.sortPolicyProperty().set(t -> { 
    Comparator<Row> comparator = (r1, r2) -> { 
     int n1 = of.wrap.els.getElement(toZ(r1.getSymbol())).getZ(); 
     int n2 = of.wrap.els.getElement(toZ(r2.getSymbol())).getZ(); 
     return n1 > n2 ? 1 
     : n1 < n2 ? -1 
     : n1 == n2 ? 0 
     : t.getComparator() == null ? 0 //no column sorted: don't change order 
     : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly 
     }; 
     FXCollections.sort(elementsTable.getItems(), comparator); 
    return true; 
}); 

Вы можете избежать безумных вложенных-Несс, сделав Компаратор постоянного нерабочие внешняя лямбда. Также обратите внимание, что последние два : t.getComparator()... никогда не будут достигнуты.

+0

Я взял их из примера, не был уверен, как они когда-либо были, но оставил их. Есть ли ресурс, который вы можете указать мне на этот объясняет внутреннее возвращение там? –

+2

Мне нужно было бы посмотреть один, но, как правило, вы можете представить скобки, подобные скобкам тела метода, в которых вам также нужен оператор return. – Clashsoft

+0

Спасибо, этот ответ очень помог мне понять это и реализовать компараторы для нескольких других объектов, а также без упомянутого безумного гнездования. –