当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Scala jdk.StreamConverters用法及代码示例


用法:

object StreamConverters extends StreamExtensions

此对象提供扩展方法来创建对 Scala 集合进行操作的Java Streams(顺序或并行).有关 Java 流的更多信息,请参阅文档 (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html)。

编写 Java 代码时,请改用 javaapi.StreamConverters 中定义的显式转换方法。

asJavaSeqStreamasJavaParStream 方法将集合转换为 Java 流:

scala> import scala.jdk.StreamConverters._

scala> val s = (1 to 10).toList.asJavaSeqStream
s: java.util.stream.IntStream = java.util.stream.IntPipeline$Head@7b1e5e55

scala> s.map(_ * 2).filter(_ > 5).toScala(List)
res1: List[Int] = List(6, 8, 10, 12, 14, 16, 18, 20)

注意:在 Scala REPL 中使用并行流会导致死锁,请参阅https://github.com/scala/bug/issues/9076。作为解决方法,请使用 scala -Yrepl-class-based

scala> def isPrime(n: Int): Boolean = !(2 +: (3 to Math.sqrt(n).toInt by 2) exists (n % _ == 0))
isPrime: (n: Int)Boolean

scala> (10000 to 1000000).asJavaParStream.filter(isPrime).toScala(Vector)
res6: scala.collection.immutable.Vector[Int] = Vector(10007, 10009, 10037, 10039, ...

Java Stream 提供对一系列元素的操作。流是从 Spliterators 创建的,它与迭代器类似,具有将其某些元素分区的附加函数。如果 Spliterator 支持,此分区用于并行化 Stream 操作。

Scala 集合有一个方法 stepper ,它为集合返回一个scala.collection.Stepper,然后可以将其转换为用于创建Java Stream 的Spliterator。

asJavaSeqStream 扩展方法适用于任何 Scala 集合。 asJavaParStream 扩展方法只能在 stepper 方法的返回类型用 scala.collection.Stepper.EfficientSplit 标记特征标记的集合上调用。这个特性被添加到支持分区的步进器中,因此可以进行高效的并行处理。

可以使用以下扩展方法:

集合类型

扩展方法

IterableOnce

asJavaSeqStream

IndexedSeq,数组,BitSet , Accumulator , HashMap , HashSet , Range , TreeMap , TreeSet , Vector,字符串

asJavaParStream

Map

asJavaSeqKeyStream , asJavaSeqValueStream

HashMap , TreeMap

asJavaParKeyStream , asJavaParValueStream

Stepper

asJavaSeqStream

Stepper with EfficientSplit

asJavaParStream

Strings

asJavaSeqStream , asJavaParStream , asJavaSeqCharStream , asJavaParCharStream , asJavaSeqCodePointStream , asJavaParCodePointStream

Java 流

toScala , asJavaPrimitiveStream

asJavaPrimitiveStream 方法将 Stream[Int] 转换为 IntStream 。它是在原始流上定义的 boxed 方法的对偶(例如,IntStream.boxedStream[Integer] )。

Java 流上的 toScala 扩展方法将流管道的结果收集到 Scala 集合中,例如 stream.toScala(List)stream.toScala(Vector) 。请注意,流上的转换操作是惰性的(也称为 "intermediate"),诸如 forEachcounttoScala 之类的终端操作会触发评估。

将并行流收集到集合中可以并行执行。如果目标集合支持并行构建的段的有效合并,这将是有益的。为了支持这个用例,Scala 标准库提供了Accumulator 集合。该集合支持高效的并行构造,并且它具有 IntLongDouble 的专用子类型,因此可以将原始 Java 流收集到 Scala 集合中而无需对元素进行装箱。

源码:

StreamConverters.scala

相关用法


注:本文由纯净天空筛选整理自scala-lang.org大神的英文原创作品 jdk.StreamConverters。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。