我在JavaFX TableView Sort Policy的答案中按照示例来做我自己的比较器,但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'expected”或 - &gt;如果最终成为非法表达的话。
做正在尝试的事情的正确方法是什么?
答案 0 :(得分:2)
您不能在Lambda表达式的范围之外分配变量,并且需要将多个语句放在括号中:
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;
});
通过使比较器在外部lambda之外保持不变,可以避免疯狂的嵌套。另请注意,永远不会达到最后两个: t.getComparator()...
。