用法 一
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。