Kotlin中具有BiPredicate的Files.find()

时间:2018-08-16 11:31:31

标签: file-io kotlin

我想在文件树中找到所有文件。在Java中,我会写类似的东西:

try(Stream<Path< paths = Files.find(startingPath, maxDepth,
   (path, attributes) -> !attributes.isDirectory())) {
          paths.forEach(System.out::println);
}

但是我正在使用kotlin,并想到了:

Files.find(startingPath,maxDepth,
        { (path, basicFileAttributes) -> !basicFileAttributes.isDirectory()}
).use { println(it) }

但是,这给了我错误:

  

无法推断此参数的类型。请明确指定。

     

类型不匹配:

     

必需:BiPredicate <路径!,BasicFileAttributes! >!

     

找到:(???)->布尔值

您知道在这种情况下如何使用BiPredicate吗?
预先感谢

4 个答案:

答案 0 :(得分:3)

BiPredicate是Java类,Kotlin函数类型不直接兼容。这是由于缺少SAM转换,我最近的回答here也对此进行了解释。

您需要传递的是类型为matcher的对象BiPredicate<Path, BasicFileAttributes>。澄清一下,像这样:

val matcher = object : BiPredicate<Path, BasicFileAttributes>
{
    override fun test(path: Path, basicFileAttributes: BasicFileAttributes): Boolean
    {
        return !basicFileAttributes.isDirectory()
    }
}

这可以简化为:

val matcher = BiPredicate<Path, BasicFileAttributes> { path, basicFileAttributes ->
    !basicFileAttributes.isDirectory()
}

当您将其传递给Files.find()时,Kotlin甚至可以推断出通用参数类型。因此,总的来说,您的表情将是:

Files.find(startingPath, maxDepth, BiPredicate { path, basicFileAttributes ->
    !basicFileAttributes.isDirectory()
}).use { println(it) }

答案 1 :(得分:0)

您在那里遇到了两个问题。使用BiPredicate { x, y -> code }来解决编译器给您的类型不匹配错误,然后通过将.use替换为forEach来实现其实际意图。否则,它将打印流对象。

Files.find(startingPath, maxDepth,
        BiPredicate { path, basicFileAttributes -> !basicFileAttributes.isDirectory() }
).forEach { println(it) }

答案 2 :(得分:0)

使用<mat-form-field appearance="outline"> <mat-label>Project</mat-label> <mat-select formControlName="Project"> <mat-option *ngFor="let project of projects" [value]="project._id"> {{project.ProjectName}} </mat-option> </mat-select> </mat-form-field> 获得科特林式的更多方式。

FileTreeWalk

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/-file-tree-walk/index.html

答案 3 :(得分:0)

Kotlin 1.4非常适合您的原始作品。

Files.find(MY_PATH, 1,
  { path, basicFileAttributes -> 
    !basicFileAttributes.isDirectory && path.endsWith("address") 
  }
)
.use {
  it.forEach { println(it) }
}