【问题标题】:java stream filter not showing outputjava流过滤器不显示输出
【发布时间】:2017-09-07 21:49:31
【问题描述】:

以下代码显示文件。

Files.walk(Paths.get("E:\\pdf"))
                .map(path -> path.toAbsolutePath().getFileName())
                        .forEach(System.out::println);

但这并不显示 pdf 输出,为什么它不起作用?

Files.walk(Paths.get("E:\\pdf"))
                .map(path -> path.toAbsolutePath().getFileName())
                    .filter(path -> path.endsWith(".pdf"))
                        .forEach(System.out::println);

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    正如this question 指出和this article 解释的那样,path.endsWith() 只有在最终目录分隔符之后的所有内容都完全匹配时才返回 true:

    如果您需要比较java.io.file.Path 对象,请注意Path.endsWith(String) 只会匹配原始路径中 Path 对象的另一个子元素,而不是路径名字符串部分!如果要匹配字符串名称部分,则需要先调用Path.toString()

    快速解决方法是将过滤器替换为:

    path.toString().toLowerCase().endsWith(".pdf");
    

    还有Java NIO的PathMatcher,是为处理路径而生的。这是一个例子:

    final PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.pdf");
    

    您可以使用:

    .filter(path -> matcher.matches(path))
    

    更多详情请参阅Finding Files 教程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多