【问题标题】:How can i get around this? [duplicate]我怎样才能解决这个问题? [复制]
【发布时间】:2019-04-10 03:26:01
【问题描述】:

我有这段代码,但我不明白为什么会出现以下错误:

local variables referenced from a lambda expression must be final or effectively final

这是我的代码

    public int firstMissingPositive(int[] nums) {

        int k;

        for (int i = 1;; i++) {
            if (!Arrays.stream(nums).anyMatch(x -> x != i)) {
                k = i;
                break;
            }
        }
        return k;
    }

【问题讨论】:

  • 如果您键入 从 lambda 表达式引用的局部变量必须是 final 或有效 final 或它们的某种组合,SO 会显示多个重复项。
  • 代码性能很差(O(n^2))。您可以通过对数组进行排序或通过构建找到的值的boolean[] 或 ... 来获得更好的性能
  • 未来:请花一些时间为您的问题找到一个合理的标题。这是一个问答社区,所有内容都应该写成对未来的读者有帮助。很少有未来的读者会发现 我怎样才能解决这个问题? 是一个有用的起点......
  • 今天很抱歉。我会牢记这一点。

标签: java lambda java-8


【解决方案1】:

因为i 不是实际上是最终的(请参阅i++),它必须在 lambda 表达式中使用。

通过在循环内分配一个新的局部变量,很容易修复:

public int firstMissingPositive(int[] nums) {
    int k;
    for (int i = 1;; i++) {
        final int j = i;
        if (! Arrays.stream(nums).anyMatch(x -> x != j)) {
            k = j;
            break;
        }
    }
    return k;
}

【讨论】:

  • 这应该也可以在没有 j 的 final 关键字的情况下工作,对吧?
  • @Deadpool 是的。即使没有关键字,它也是“有效的最终”。
  • 听起来不错@Michael
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2020-11-28
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
相关资源
最近更新 更多