File io Kotlin中带有BiPredicate的Files.find()
我想在文件树中找到所有文件。在Java中,我会编写如下内容:File io Kotlin中带有BiPredicate的Files.find(),file-io,kotlin,File Io,Kotlin,我想在文件树中找到所有文件。在Java中,我会编写如下内容: try(Stream<Path< paths = Files.find(startingPath, maxDepth, (path, attributes) -> !attributes.isDirectory())) { paths.forEach(System.out::println); } 但是,这给了我一个错误: 无法推断此参数的类型。请明确指定它 类型不匹配: 必需:双预测 发
try(Stream<Path< paths = Files.find(startingPath, maxDepth,
(path, attributes) -> !attributes.isDirectory())) {
paths.forEach(System.out::println);
}
但是,这给了我一个错误:
无法推断此参数的类型。请明确指定它
类型不匹配:
必需:双预测<路径!,基本文件属性!>
发现:(?)->布尔值
您知道如何在这种情况下使用
BiPredicate
吗?BiPredicate
是一个Java类,Kotlin函数类型不能直接兼容。这是由于缺少SAM转换,我在最近的回答中也解释了这一点
您需要传递的是类型为BiPredicate的对象matcher
。澄清一下,类似这样的事情:
val matcher = object : BiPredicate<Path, BasicFileAttributes>
{
override fun test(path: Path, basicFileAttributes: BasicFileAttributes): Boolean
{
return !basicFileAttributes.isDirectory()
}
}
你有两个问题。对编译器提供的类型不匹配错误使用
BiPredicate{x,y->code}
,然后通过替换,让编译器实际执行它打算执行的操作。使用forEach
。否则,它将打印流对象
Files.find(startingPath, maxDepth,
BiPredicate { path, basicFileAttributes -> !basicFileAttributes.isDirectory() }
).forEach { println(it) }
使用FileTreeWalk
了解更多Kotlin-ish方式
File(startingPath).walk()
.filter { !it.isDirectory }
.toList()
Kotlin 1.4非常适合您的原始版本
文件。查找(我的路径,1,
{路径,基本文件属性->
!basicFileAttributes.isDirectory&&path.endsWith(“地址”)
}
)
.使用{
it.forEach{println(it)}
}
Files.find(startingPath, maxDepth, BiPredicate { path, basicFileAttributes ->
!basicFileAttributes.isDirectory()
}).use { println(it) }
Files.find(startingPath, maxDepth,
BiPredicate { path, basicFileAttributes -> !basicFileAttributes.isDirectory() }
).forEach { println(it) }
File(startingPath).walk()
.filter { !it.isDirectory }
.toList()