Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File io Kotlin中带有BiPredicate的Files.find()_File Io_Kotlin - Fatal编程技术网

File io Kotlin中带有BiPredicate的Files.find()

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); } 但是,这给了我一个错误: 无法推断此参数的类型。请明确指定它 类型不匹配: 必需:双预测 发

我想在文件树中找到所有文件。在Java中,我会编写如下内容:

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()