Java-如何将Scala Stream转换为Java Stream?

jon*_*lee 2 java scala scala-java-interop

我有一个接收到的Java应用程序Scala Stream

我需要将其转换为Java Stream

如何在Java中做到这一点?

Xav*_*hot 6

从 开始Scala 2.13,标准库scala.jdk.javaapi.StreamConverters提供了 Java 到 Scala 的隐式流转换:

import scala.jdk.javaapi.StreamConverters;

// val scalaStream = Stream(1, 2, 3)
StreamConverters.asJavaSeqStream(scalaStream);
// java.util.stream.Stream[Int] = java.util.stream.ReferencePipeline$Head@3cccf515
Run Code Online (Sandbox Code Playgroud)

请注意, s在 Scala 2.13 中Stream被重命名,在这种情况下:LazyList

// val scalaLazyList = LazyList(1, 2, 3)
StreamConverters.asJavaSeqStream(scalaLazyList);
// java.util.stream.Stream[Int] = java.util.stream.ReferencePipeline$Head@4997c13
Run Code Online (Sandbox Code Playgroud)


lyj*_*kal 5

这有一段很长的路要走,但是您可以将scala流转换为可迭代的,转换为Java可迭代的,然后从Java可迭代的构造Java流:

scala>
import java.util.stream.StreamSupport
import scala.collection.JavaConverters._

def stream2javaStream[T](scalaStream: scala.Stream[T]): java.util.stream.Stream[T] = {
    StreamSupport.stream(scalaStream.toIterable.asJava.spliterator(), false);
}


stream2javaStream((1 to 100).toStream)

res0: java.util.stream.Stream[Int] = java.util.stream.ReferencePipeline$Head@2489e84a
Run Code Online (Sandbox Code Playgroud)

在回旋时,这不会“实现”流,从而保持其效率。

scala>
stream2javaStream((1 to 100).toStream.map{i => println(i); i})
1
res1: java.util.stream.Stream[Int] = java.util.stream.ReferencePipeline$Head@9b21bd3
Run Code Online (Sandbox Code Playgroud)

仅在流的开头打印1