簡體   English   中英

來自scala代碼的Java 8 Stream

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM