Scala到Java8流兼容性问题

时间:2016-01-30 12:06:31

标签: scala lambda java-8 java-stream

(阶)

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

工作正常

怎么了?

3 个答案:

答案 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) } )