当前位置: 代码迷 >> java >> Java:lambda局部变量声明问题
  详细解决方案

Java:lambda局部变量声明问题

热度:114   发布时间:2023-07-17 20:51:22.0

我正在遵循答案中的示例来做我自己的比较器,但是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'预期值”,或者->如果为final,则成为非法的表达式开始。

做我正在尝试的正确方法是什么?

您不能在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()...将永远不会到达。

  相关解决方案