[英]Java - How to convert Scala Stream to Java Stream?
我有一個接收Scala Stream
的Java應用程序。
我需要將其轉換為Java Stream
。
如何在Java中做到這一點?
這有一段很長的路要走,但是您可以將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
在回旋時,這不會“實現”流,從而保持其效率。
scala>
stream2javaStream((1 to 100).toStream.map{i => println(i); i})
1
res1: java.util.stream.Stream[Int] = java.util.stream.ReferencePipeline$Head@9b21bd3
僅在流的開頭打印1
如果您不想並行處理流,則可以簡單地將AbstractSpliterator子類化:
import java.util.function.Consumer
import java.util.stream.StreamSupport
import java.util.{Spliterator, Spliterators}
def streamToJava[T](s: Stream[T]): java.util.stream.Stream[T] = {
var ss: Stream[T] = s
val splitr = new Spliterators.AbstractSpliterator[T](Long.MaxValue, Spliterator.IMMUTABLE) {
override def tryAdvance(action: Consumer[_ >: T]): Boolean = ss match {
case Stream.Empty => false
case h #:: tl => {ss = tl; action.accept(h); true}
}
}
StreamSupport.stream(splitr, false)
}
另一個答案(我太新了,不能發表評論)是不正確的,因為它調用了實現整個流的大小。
從Scala 2.13
開始,標准庫包括scala.jdk.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
請注意,在Scala 2.13 LazyList
Stream
s重命名為LazyList
,在這種情況下:
// val scalaLazyList = LazyList(1, 2, 3)
StreamConverters.asJavaSeqStream(scalaLazyList);
// java.util.stream.Stream[Int] = java.util.stream.ReferencePipeline$Head@4997c13
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.