从提供的目录中的文件名创建字符串列表

时间:2019-06-26 13:16:59

标签: java scala file-io

我的问题可能很明显。想看一个目录并创建字符串列表,其中每个字符串代表存储在给定目录中的文件名,例如列表(“ file1.csv”,“ file2.csv”,“ file3.csv”)。

我使用创建列表的功能,但是它是文件列表(不是字符串),并且包含完整路径(不仅是文件名)。

import java.io.File

def getFileNames(path: String): List[File] = {
  val d = new File(path)
  if (d.exists && d.isDirectory) {
    d
      .listFiles // create list of File
      .filter(_.isFile)
      .toList
      .sortBy(_.getAbsolutePath().replaceAll("[^a-zA-Z0-9]",""))
  } else {
    Nil // return empty list
  }
}

谢谢所有的想法。

2 个答案:

答案 0 :(得分:2)

尝试将getFileNames的返回类型更改为List[String],并像这样使用map(_.getName)

def getFileNames(path: String): List[String] = {
    val d = new File(path)
    if (d.exists && d.isDirectory) {
      d
        .listFiles // create list of File
        .filter(_.isFile)
        .toList
        .sortBy(_.getAbsolutePath().replaceAll("[^a-zA-Z0-9]",""))
        .map(_.getName)
    } else {
      Nil // return empty list
    }
  }

确保.map(_.getName)是链中的最后一个,即在sortBy之后。

better-files会将其简化为

import better.files._
import better.files.Dsl._
val file = file"."
ls(file).toList.filter(_.isRegularFile).map(_.name)

答案 1 :(得分:1)

您可以使用getName方法

并且正如Tomasz所指出的,过滤器和地图可以结合起来进行收集,如下所示:

def getFileNames(path: String): List[String] = {
  val d = new File(path)
  if (d.exists && d.isDirectory) {
    d
      .listFiles // create list of File
      .collect{ case f if f.isFile => f.getName }// gets the name of the file  <--
      .toList
      .sortBy(_.getAbsolutePath().replaceAll("[^a-zA-Z0-9]",""))
  } else {
    Nil // return empty list
  }
}