scala中的forEach显示预期:Consumer [_>:Path] actual:(Path)=>布尔

时间:2017-06-20 20:43:09

标签: scala scala-streams

递归删除scala文件时出现错误的语法问题

Files.walk(path, FileVisitOption.FOLLOW_LINKS)
    .sorted(Comparator.reverseOrder())
    .forEach(Files.deleteIfExists)

2 个答案:

答案 0 :(得分:4)

问题在于您尝试将scala样式函数传递给期望java-8样式函数的方法。那里有几个可以进行转换的库,或者你可以自己编写它(它并不复杂),或者最简单的方法就是将java集合转换为具有foreach方法的scala集合。 scala-style函数作为参数:

import scala.collection.JavaConverters._

Files.walk(path, FileVisitOption.FOLLOW_LINKS)
        .sorted(Comparator.reverseOrder())
        .iterator().asScala
        .foreach(Files.deleteIfExists)

答案 1 :(得分:0)

在Scala 2.12中,我希望这应该有效:

...forEach(Files.deleteIfExists(_: Path))

您需要指定参数类型的原因是因为预期类型为Consumer[_ >: Path],而不是Scala中的Consumer[Path]

如果它不起作用(目前无法测试),请尝试

val deleteIfExists: Consumer[Path] = Files.deleteIfExists(_)

...forEach(deleteIfExists)

在Scala 2.12之前,Joe K的回答是正确的。