我想在文件树中找到所有文件。在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吗?
预先感谢
答案 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) }
}