當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。