首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java -如何将Scala流转换为Java流?

Java -如何将Scala流转换为Java流?
EN

Stack Overflow用户
提问于 2015-11-25 23:13:16
回答 3查看 2.1K关注 0票数 2

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

我需要将它转换为Java Stream

我如何在Java中做到这一点

EN

回答 3

Stack Overflow用户

发布于 2015-11-26 00:30:07

这有点长,但您可以将scala流转换为iterable,再转换为java iterable,然后从java iterable构造java流:

代码语言:javascript
复制
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

在环形交叉路口时,这并不“实现”流,而是保持其效率。

代码语言:javascript
复制
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

票数 5
EN

Stack Overflow用户

发布于 2019-03-30 23:09:49

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

代码语言:javascript
复制
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

请注意,在Scala2.13中,Stream被重命名为LazyList,在这种情况下:

代码语言:javascript
复制
// val scalaLazyList = LazyList(1, 2, 3)
StreamConverters.asJavaSeqStream(scalaLazyList);
// java.util.stream.Stream[Int] = java.util.stream.ReferencePipeline$Head@4997c13
票数 4
EN

Stack Overflow用户

发布于 2018-10-31 06:51:36

如果你不想并行处理这个流,你可以简单的子类化AbstractSpliterator:

代码语言:javascript
复制
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)
  }

另一个答案(我太新了,无法评论)是不正确的,因为它调用了实现整个流的size。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33920031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档