使用 Java 8 在数组/列表中收集文件名 [重复]

Posted

技术标签:

【中文标题】使用 Java 8 在数组/列表中收集文件名 [重复]【英文标题】:Collecting file names in an array/list with Java 8 [duplicate] 【发布时间】:2020-02-28 17:56:55 【问题描述】:

所以我在尝试收集特定文件夹中的所有文件名并将它们存储在数组 [] 或注释中的列表中时遇到了问题。

这是目前为止的代码:

String[] alist = new String[];
Files.list(Paths.get("mypath")).filter(Files::isRegularFile).forEach(System.out::println(alist);

String[] alist;
alist = Files.list(Paths.get("mypath")).filter(Files::isRegularFile).toArray(String[]::new);

Stream<String> alist = Stream.of(Files.list(Paths.get("path")).filter(Files::isRegularFile).toString());
                    String[] alist2 = alist.toArray(size -> new String[size]);

如您所见,我很难找出正确的方法。

目的是一旦我将所有文件名存储在一个数组中。然后我可以拆分数组中的每个字符串。然后创建一个从数组中的拆分字符串构建的 hashmap [key][name]。

几年后我才刚刚回到 Java 和 OOP,所以我有点生疏了。

感谢您的帮助!

【问题讨论】:

为什么要使用数组?使用List 更为常见。 我应该使用你是对的列表。要么/要么工作,只要它完成工作。我继续并更改了标题。 Java Stream API 有一些终端操作,例如forEach()collect()。如果您需要一个列表,请使用Stream.of(...).filter(p-&gt;doSomething(p)).collect(Collectors.toList()) 据我所知,您确实需要一个 HashMap。 java.util.stream.Collectors 有一些有用的收集器实现来创建列表或地图。 【参考方案1】:

正如@zforgo 所说,只需使用stream.map(for process each element) 并收集即可获得列表结果

List<String> filenames = Files.list(Paths.get("D:\\game\\Rayman1"))
    .filter(Files::isRegularFile)
    .map(p -> p.getFileName().toString())
    .collect(Collectors.toList());

【讨论】:

虽然不完全相关,但我们不应该使用 try( Stream s = File.list() ) 来源:***.com/questions/38698182/close-java-8-stream,如果使用其他方式,可能会导致操作系统中打开文件句柄或泄漏【参考方案2】:

尝试以下方法:

    String[] fileNames = Arrays.stream(new File("dir").list().map(File::new)
           .filter(File::isFile).map(File::getName).toArray(String[]::new);

    for (String s : fileNames) 
        System.out.println(s);
    

或者你可以这样做。

      try 
         String[] fileNames =
               Files.list(Paths.get("dir")).filter(
                     Files::isRegularFile).map(
                           p -> p.toFile().getName()).toArray(String[]::new);

         for (String s : fileNames) 
            System.out.println(s);
         
      
      catch (Exception e) 
         e.printStackTrace();
      

【讨论】:

是否有特定原因你建议使用旧的麻烦的java文件io而不是NIO FilesPathsPath "Files.list(..." 此代码打开一个流,但没有关闭它...

以上是关于使用 Java 8 在数组/列表中收集文件名 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 数组收集数据的数组列表

如何将流的结果收集到Java 8中的自定义对象数组中[重复]

如何收集清单 列表 在java中使用流?

Spark Java - 将多列收集到数组列中

java 8流收集最大对象,并按属性区分

将Java 8 GC日志重定向到stderr