簡體   English   中英

Java-如何將Scala Stream轉換為Java Stream?

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

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