【问题标题】:Java: lambda local variable declaration issueJava:lambda局部变量声明问题
【发布时间】:2015-07-30 22:10:14
【问题描述】:

我正在按照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 的所有实例在范围内都标记为未定义,但作为 n1 一部分的第一个 r1 除外。

如果我尝试在内部将 n1、n2 声明为 int,它会给出“'.class' expected”,或者 -> 如果 final 则成为非法的表达式开头。

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

【问题讨论】:

  • 需要{}(params)-&gt;{ statements }

标签: java lambda


【解决方案1】:

不能在 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()...

【讨论】:

  • 我从示例中获取了这些,不确定它们会如何,但将它们留在了里面。您可以指出我的资源来解释那里的内部回报吗?
  • 我需要查找一个,但根据经验,您可以将括号想象为方法体的括号,其中还需要一个 return 语句。
  • 谢谢,这个答案帮助我理解了这一点,并为少数其他对象实现了比较器,并且没有上述疯狂的嵌套。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
相关资源
最近更新 更多