用法 一
abstract class Accumulator[@specialized(Double, Int, Long) A, +CC <: (Seq), +C <: Seq[A]] extends Seq[A] with Builder[A, C]
累加器是具有兩個不同特征的可變序列:
累加器可以有效地附加到另一個
Int
、Long
和Double
有手動專用的累加器,它們不會將元素裝箱
這兩個特性使 Accumulators 成為將並行 Java 流管道的結果收集到 Scala 集合中的理想選擇。 Java 流上的 scala.collection.convert.StreamExtensions.StreamHasToScala.toScala 擴展方法(可通過導入 scala.jdk.StreamConverters._
獲得)專門用於累加器:它們是並行構建的,各部分被有效地合並。
構建專門的累加器是透明處理的。作為用戶,使用Accumulator 對象作為工廠會根據元素類型自動創建IntAccumulator、LongAccumulator、DoubleAccumulator 或AnyAccumulator。
注意:要運行該示例,請使用 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.map 或 IntAccumulator.exists 。由於 Scala 的函數特化,intAcc.exists(x => testOn(x))
不會產生裝箱。
scala.collection.Stepper 接口提供 iterator-like hasStep
和 nextStep
方法,並且專用於 Int
、 Long
和 Double
。 intAccumulator.stepper
方法創建一個scala.collection.IntStepper,它在沒有裝箱的情況下產生累加器的元素。
累加器可以容納多個 Int.MaxValue
元素。他們有一個 sizeLong 方法,該方法將大小返回為 Long
。請注意,scala.collection.Seq 中定義的某些操作是使用 length 實現的,因此它們對於大型累加器將無法正常工作。
Accumulator 類是在 AnyAccumulator(用於引用類型)和手動專業化 IntAccumulator 、 LongAccumulator 和 DoubleAccumulator 之間共享代碼的基類。
伴生:
- 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 jdk.OptionConverters用法及代碼示例
- Scala jdk.StreamConverters用法及代碼示例
- Scala jdk.CollectionConverters用法及代碼示例
- Scala jdk.FunctionConverters用法及代碼示例
- Scala javaapi.CollectionConverters用法及代碼示例
- Scala Tabulate.sliding用法及代碼示例
- Scala ArrayBuffer.inits用法及代碼示例
- Scala long.BitwiseOr用法及代碼示例
- Scala StringBuilder.partitionMap用法及代碼示例
- Scala List distinct()用法及代碼示例
- Scala DefaultMap.sizeIs用法及代碼示例
- Scala StrictOptimizedIterableOps.sliding用法及代碼示例
- Scala Searching.SearchResult用法及代碼示例
- Scala ::.collectFirst用法及代碼示例
- Scala TreeSet diff()用法及代碼示例
- Scala Char getClass()用法及代碼示例
- Scala int.Min用法及代碼示例
- Scala IntMap.groupMap用法及代碼示例
- Scala Map3.mkString用法及代碼示例
- Scala IterableOnceOps.flatMap用法及代碼示例
- Scala IndexedSeqOps.lengthIs用法及代碼示例
- Scala Map3.addString用法及代碼示例
- Scala WrappedString.scanRight用法及代碼示例
- Scala String compareToIgnoreCase()用法及代碼示例
- Scala List drop()用法及代碼示例
注:本文由純淨天空篩選整理自scala-lang.org大神的英文原創作品 jdk.Accumulator。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。