【问题标题】:Java 8 Stream from scala code来自scala代码的Java 8 Stream
【发布时间】:2016-09-18 06:26:57
【问题描述】:

我正在尝试使用以下 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/892d6063dd485d7dd221 一样简单明了,但它似乎不起作用。我正在运行 Scala 2.11.8

【问题讨论】:

    标签: java scala java-8 java-stream


    【解决方案1】:

    您可以转换为iterator 以迭代java Stream,例如:

    import scala.collection.JavaConverters._
    bufferedReader.lines().iterator.asScala.forEach(s => sendRecord(s))
    

    【讨论】:

      【解决方案2】:

      查看您在问题中链接的文件的顶部。它提到了-Xexperimental 标志。如果您使用此标志运行 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 的发布,有问题的代码可以正常编译。

      【讨论】:

        【解决方案3】:

        问题在于 scala 中的表达式不会自动实现预期的 java 函数接口 Consumer。

        有关如何解决问题的详细信息,请参阅这些问题。在 Scala 2.12 中,它可能无需转换即可工作。

        【讨论】:

          【解决方案4】:

          在 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-02-29
            • 2019-10-04
            • 1970-01-01
            • 2011-02-26
            • 2015-03-24
            • 2012-04-10
            • 1970-01-01
            相关资源
            最近更新 更多