Я следую примеру в ответе на 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» ожидается, или -> становится незаконным началом выражения, если оно окончательно.
Каков правильный способ делать то, что я пытаюсь?
need '{}' '(params) -> {statements}' – ZhongYu