[英]Java 8 Stream from scala code
我正在嘗試使用scala代碼中的Java 8 Stream,如下所示,並且遇到編譯錯誤。
任何幫助贊賞!!
def sendRecord(record: String): Unit throws Exception
bufferedReader.lines().forEach(s => sendRecord(s))
Cannot resolve forEach with such signature, expect: Consumer[_ >: String], actual: (Nothing)
PS:雖然有一些跡象表明它幾乎是直截了當的,如https://gist.github.com/adriaanm/892d6063dd485ddd221,它似乎不起作用。 我正在運行Scala 2.11.8
您可以轉換為iterator
來迭代java Stream
,如:
import scala.collection.JavaConverters._
bufferedReader.lines().iterator.asScala.forEach(s => sendRecord(s))
查看您在問題中鏈接的文件的頂部。 它提到了-Xexperimental
flag。 如果運行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中的表達式不會自動實現預期的java功能接口Consumer。
請參閱這些問題,了解如何解決它。 在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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.