(阶)
Files.walk(Paths.get("")).forEach(x => log.info(x.toString))
给出
Error:(21, 16) missing parameter type
.forEach(x => log.info(x.toString))
^
和(java8)
Files.walk(Paths.get("")).forEach(x -> System.out.println(x.toString()));
工作正常
怎么了?
答案 0 :(得分:8)
stream.forEach(x -> foo())
在java中是
stream.forEach(
new Consumer<Path> { public void accept(Path x) { foo(); } }
)
这与scala中的x => ...
完全相同,后者是Function[Path,Unit]
的一个实例。
试试这个;
Files.walk(Paths.get(""))
.forEach(new Consumer[Path] { def accept(s: Path) = println(s) })
答案 1 :(得分:1)
替代路由:您可以将java流转换为scala流并使用普通的scala函数,而不是将scala函数转换为java使用者。
scala> import scala.collection.JavaConverters._
scala> import java.nio.file._
scala> val files = Files.walk(Paths.get("/tmp")).iterator.asScala.toStream
files: scala.collection.immutable.Stream[java.nio.file.Path] = Stream(/tmp, ?)
files.foreach(println(_))
答案 2 :(得分:0)
Scala 2.12具有更好的Java 8互操作性,请查看Scala 2.12 announcement;因此,您编写的代码在2.12中编译得很好:
Files.walk(Paths.get("")).forEach(x => System.out.println(x.toString))
如果您需要在2.11中使用此功能,请使用scala-java8-compat。这是依赖
libraryDependencies += "org.scala-lang.modules" %% "scala-java8-compat" % "0.8.0"
在这种情况下,您可以像这样使用它:
import scala.compat.java8.FunctionConverters._
Files.walk(Paths.get("")).forEach( asJavaConsumer { x => println(x.toString) } )