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


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