我怎样才能解决这个问题? [复制]

Posted

技术标签:

【中文标题】我怎样才能解决这个问题? [复制]【英文标题】: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[] 或 ... 来获得更好的性能 未来:请花一些时间为您的问题找到一个合理的标题。这是一个问答社区,所有内容都应该写成对未来的读者有帮助。很少有未来的读者会发现 我怎样才能解决这个问题? 是一个有用的起点...... 今天很抱歉。我会牢记这一点。 【参考方案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

以上是关于我怎样才能解决这个问题? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能用 mongodb 编写这个查询? [复制]

XAMPP 启动中的这个错误是啥?我怎样才能解决这个问题?

我怎样才能从一个位数组到一个字节? [复制]

为啥应用程序在 iPhone 模拟器中崩溃;我怎样才能解决这个问题?

错误:请安装 PostCSS 8 或更高版本。我怎样才能解决这个问题?

可变变量可以从闭包中访问。我怎样才能解决这个问题?