Я следую примеру в ответе на JavaFX TableView Sort Policy, чтобы сделать свой собственный компаратор, но лямбда-выражения для меня новы, и мне трудно понять, что происходит.
То, что работает, уродливо:
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'» или -> станет недопустимым началом выражения, если оно окончательное.
Каков правильный способ сделать то, что я пытаюсь?