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


Scala jdk.Accumulator用法及代碼示例

用法 一

abstract class Accumulator[@specialized(Double, Int, Long) A, +CC <: (Seq), +C <: Seq[A]] extends Seq[A] with Builder[A, C]

累加器是具有兩個不同特征的可變序列:

  • 累加器可以有效地附加到另一個

  • IntLongDouble 有手動專用的累加器,它們不會將元素裝箱

這兩個特性使 Accumulators 成為將並行 Java 流管道的結果收集到 Scala 集合中的理想選擇。 Java 流上的 scala.collection.convert.StreamExtensions.StreamHasToScala.toScala 擴展方法(可通過導入 scala.jdk.StreamConverters._ 獲得)專門用於累加器:它們是並行構建的,各部分被有效地合並。

構建專門的累加器是透明處理的。作為用戶,使用Accumulator 對象作為工廠會根據元素類型自動創建IntAccumulatorLongAccumulatorDoubleAccumulatorAnyAccumulator

注意:要運行該示例,請使用 scala -Yrepl-class-based 啟動 Scala REPL 以避免死鎖,請參閱 https://github.com/scala/bug/issues/9076

scala> import scala.jdk.StreamConverters._
import scala.jdk.StreamConverters._

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

scala> val intAcc = (1 to 10000).asJavaParStream.filter(isPrime).toScala(scala.jdk.Accumulator)
intAcc: scala.jdk.IntAccumulator = IntAccumulator(1, 3, 5, 7, 11, 13, 17, 19, ...

scala> val stringAcc = (1 to 100).asJavaParStream.mapToObj("<>" * _).toScala(Accumulator)
stringAcc: scala.jdk.AnyAccumulator[String] = AnyAccumulator(<>, <><>, <><><>, ...

有兩種方法可以在沒有裝箱的情況下處理原始 Accumulator 的元素:Accumulator 的專門操作或 Stepper 接口。最常見的集合操作在基本的 Accumulator 類中被重載或覆蓋,例如 IntAccumulator.mapIntAccumulator.exists 。由於 Scala 的函數特化,intAcc.exists(x => testOn(x)) 不會產生裝箱。

scala.collection.Stepper 接口提供 iterator-like hasStepnextStep 方法,並且專用於 IntLongDoubleintAccumulator.stepper 方法創建一個scala.collection.IntStepper,它在沒有裝箱的情況下產生累加器的元素。

累加器可以容納多個 Int.MaxValue 元素。他們有一個 sizeLong 方法,該方法將大小返回為 Long 。請注意,scala.collection.Seq 中定義的某些操作是使用 length 實現的,因此它們對於大型累加器將無法正常工作。

Accumulator 類是在 AnyAccumulator(用於引用類型)和手動專業化 IntAccumulatorLongAccumulatorDoubleAccumulator 之間共享代碼的基類。

伴生:

object

源碼:

Accumulator.scala

用法 二

object Accumulator

包含構建累加器的工廠方法。

請注意,Accumulator 對象本身不是工廠,而是根據元素類型隱式轉換為工廠,請參見 Accumulator.toFactory

這允許在 collection.Factory 和隱式 Accumulator.AccumulatorFactoryShape 實例用於根據元素類型構建專用累加器時將 Accumulator 對象作為參數傳遞:

scala> val intAcc = Accumulator(1,2,3)
intAcc: scala.collection.convert.IntAccumulator = IntAccumulator(1, 2, 3)

scala> val anyAccc = Accumulator("K")
anyAccc: scala.collection.convert.AnyAccumulator[String] = AnyAccumulator(K)

scala> val intAcc2 = List(1,2,3).to(Accumulator)
intAcc2: scala.jdk.IntAccumulator = IntAccumulator(1, 2, 3)

scala> val anyAcc2 = List("K").to(Accumulator)
anyAcc2: scala.jdk.AnyAccumulator[String] = AnyAccumulator(K)

伴生:

class

源碼:

Accumulator.scala

相關用法


注:本文由純淨天空篩選整理自scala-lang.org大神的英文原創作品 jdk.Accumulator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。