是否可以从 .forEach 方法中列出文件特征?

Is is possible to list file characteristics from .forEach method?

我正在尝试使用更多 Java 8 语法。我这里有一个简单的用例,递归地列出文件,我想打印的不仅仅是文件名,如示例所示:

public void listFiles(String path) {
    try {
        Files.walk(Paths.get(path))
             .filter(p -> {
                 return Files.isRegularFile(p);
             })
              .forEach(System.out::println);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

有没有办法从 forEach 方法中调用一个方法,将有问题的文件作为参数传递?我将如何引用该文件?

编辑:关于是否可以将正在打印的每个文件的路径作为变量传递给另一个方法的讨论存在一些混淆。

确认一下,可以。这是代码:

 public void listFiles(String path) {
        try {
            Files.walk(Paths.get(path))
                    .filter(p -> {
                        return Files.isRegularFile(p);
                    })
                    .forEach(p -> myMethod(p));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void myMethod(Path path) {
        System.out.println(path.toAbsolutePath());
        try {
            BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
            FileTime fileTime = attr.lastModifiedTime();
            System.out.println("file date: " + fileTime);
        } catch (IOException ex) {
            // handle exception
        }
    }

您可以使用 map 方法,只要您只关心通过管道传递的一个参数即可。

Files.walk(Paths.get(path))
     .filter(p -> Files.isRegularFile(p))
     .map(Path::getFileName)
     .forEach(System.out::println);

或者您可以将方法参数扩展为 forEach 方法中的 lambda 表达式,消耗通过过滤器的整个 Path(是常规文件):

Files.walk(Paths.get(path))
     .filter(p -> Files.isRegularFile(p))
     .forEach(p -> System.out.println("Path fileName: " + p.getFileName()));

为了避免混淆,变量 p 只能在 filter/forEach 方法参数的范围内访问,即。拉姆达表达式。查看展开的最后一个片段:

Files.walk(Paths.get(""))
     .filter(path1 -> Files.isRegularFile(path1))
     .forEach(new Consumer<Path>() {
         @Override
         public void accept(final Path p) {          
             // here is the `p`. It lives only in the scope of this method                 
             System.out.println("Path fileName: " + p.getFileName());
         }});