是否可以在 lambda 表达式中使用文件数组并让它更新?

问题描述

我使用的块是在 lambda 中的字符串数组列表上运行 foreach 循环。该表达式试图过滤掉与模式匹配的文件列表并将其存储在文件数组中。

这里的问题是数组列表将运行 n 次,并且它将多次更新文件数组。 我需要一个正确的解决方案,它允许使用 lambda,允许在一个路径中查找所有模式并将其存储在一个文件数组中。

我使用的错误代码是,

File[] fileList2 = null;
ArrayList<String> listofLines = new ArrayList<>();
String line = bufReader.readLine();
while (line != null) 
{
  listofLines.add(line); 
  line = bufReader.readLine(); 
}
bufReader.close();
listofLines.forEach((n) -> 
{
    fileList2 = new File("directory/path/").listFiles(new FilenameFilter()
    {
        public boolean accept(File arg0,String arg1)
        {
            boolean result;
            if(arg1.contains(n))
                result=true;
            else
                result=false;
            return result;
        }
    });
});

我的方法是不正确的原因,每次迭代fileList2都会更新,这不是必需的。

我也因为同样的原因收到错误

在封闭作用域中定义的局部变量 fileList2 必须是 final 或有效 final

解决方法

您收到错误消息,因为每次调用 lambda 时,fileList2 都会设置为不同的值,将 foreach 部分重写为正常循环可以更好地揭示正在发生的事情

File[] fileList2 = null;
...
for (String line : listOfLines) {
    fileList2 = new File("directory/path/").listFiles(...
    ...
}

如您所见,fileList2 仅设置为与 listOfLines 中的最后一个条目有关的文件数组。

顺便说一句,你可以改变

boolean result;
if(arg1.contains(n))
    result=true;
else
    result=false;
return result;

一行代码...

return arg1.contains(n);