来自scala代码的Java8流
我试图使用scala代码中的Java8流,如下所示,但遇到编译错误 谢谢你的帮助来自scala代码的Java8流,java,scala,java-8,java-stream,Java,Scala,Java 8,Java Stream,我试图使用scala代码中的Java8流,如下所示,但遇到编译错误 谢谢你的帮助 def sendRecord(record: String): Unit throws Exception bufferedReader.lines().forEach(s => sendRecord(s)) Cannot resolve forEach with such signature, expect: Consumer[_ >: String], actual: (Nothing) 附言
def sendRecord(record: String): Unit throws Exception
bufferedReader.lines().forEach(s => sendRecord(s))
Cannot resolve forEach with such signature, expect: Consumer[_ >: String], actual: (Nothing)
附言:虽然有一些迹象表明,它几乎是直截了当的,似乎不起作用。我正在运行Scala 2.11.8您可以转换为
迭代器
来迭代java流
,如:
import scala.collection.JavaConverters._
bufferedReader.lines().iterator.asScala.forEach(s => sendRecord(s))
问题是scala中的表达式不能自动实现预期的java函数接口使用者 有关如何解决的详细信息,请参见这些问题。在Scala2.12中,它可能在没有转换的情况下工作
-xeexperimental
标志。如果使用此标志运行scala编译器或repl,scala函数将被转换为java等价物。另一种选择是手动传入java函数
scala> java.util.stream.Stream.of("asd", "dsa").map(new java.util.function.Function[String, String] { def apply(s: String) = s + "x" }).toArray
res0: Array[Object] = Array(asdx, dsax)
您还可以创建(隐式)转换来包装scala函数
您也可以等待scala 2.12,在这个版本中,您将不再需要该标志
更新
随着scala 2.12的推出,相关代码将正常编译。在scala 2.12中,您可以非常轻松地使用Java流:
import java.util.Arrays
val stream = Arrays.stream(Array(1, 2, 3, 4, 6, 7))
stream
.map {
case i: Int if i % 2 == 0 => i * 2
case i: Int if i % 2 == 1 => i * 2 + 2
}
.forEach(println)