java - 相当于Java中Scala中的summaryStatistics

标签 java scala

我正在将一些 Java 代码移植到 Scala,需要提取一些非常基本的统计值,其中包括计数最大值最小值和长值流的平均值

在Java中我用这个方法解决了这个问题:

public static Stats calcStats(Iterable<Ad> iterable) {
    LongSummaryStatistics longSummaryStatistics = StreamSupport.stream(iterable.spliterator(), false).mapToLong(Ad::getEvent_time).summaryStatistics();
    return new Stats(longSummaryStatistics.getMin(), longSummaryStatistics.getMax(), round(longSummaryStatistics.getAverage()),
            longSummaryStatistics.getCount());
}

Scala 库中是否有类似的方法可以一次性提取这些值(无需使用 Spark 等额外库)?

现在我正在使用一些与此类似的代码:

def main(args: Array[String]): Unit = {
  val l = List(("s1", 1L), ("s2", 2L), ("s3", 3L), ("s4", 4L))
  val stats = summaryStatistics(l.iterator)
  println("min: %d, max: %d, avg: %f".format(stats._1, stats._2, stats._3))
}

def summaryStatistics(iter: Iterator[(String, Long)]): (Long, Long, Double) = {
  val stats = iter.map((tuple: (String, Long)) => tuple._2)
    .foldLeft((Long.MaxValue, Long.MinValue, 0L, 0L))((a, t) => (Math.min(t, a._1), Math.max(t, a._2), a._3 + 1, a._4 + t))
  (stats._1, stats._2, stats._4 / (stats._3 * 1.0))
}

打印出:

min: 1, max: 4, avg: 2.500000

最佳答案

除了 C4stor,您还可以使用更多 Scala 集合,如下所示:

import java.util.LongSummaryStatistics

def main(): Unit = {
  val l = List(("s1", 1L), ("s2", 2L), ("s3", 3L), ("s4", 4L))
  // .view here is a trick to make it semantically more similar to Java Streams i.e. to avoid materializaiton of the mapped list
  val stats = summaryStatistics(l.view.map(_._2))
  println("min: %d, max: %d, avg: %f".format(stats.getMin, stats.getMax, stats.getAverage))
}


def summaryStatistics(col: TraversableOnce[Long]): LongSummaryStatistics = {
  col.foldLeft(new LongSummaryStatistics)((stat, el) => {
    stat.accept(el)
    stat
  })
}

或者,如果您想使用 LongSummaryStatistics 中实现的潜在并行支持,您可以使用 aggregate 而不是 foldLeft,例如:

def summaryStatistics(col: TraversableOnce[Long]): LongSummaryStatistics = {
  col.aggregate(new LongSummaryStatistics)((stat, el) => {
    stat.accept(el)
    stat
  }, (s1, s2) => {
    s1.combine(s2)
    s1
  })
}

关于java - 相当于Java中Scala中的summaryStatistics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48300506/

相关文章:

java - 我如何使用 Interactive Brokers Java API 检测定单何时成交?

java - 连接到 WELD-SE 类路径扫描器

java - 如何使用单例实例模拟类

java - 如何在 Spring MVC 中使用单个 View 执行所有 CRUD 操作?

scala - 配置 IntelliJ IDEA 进行 Specs2 测试的后台编译?

java - 如何修复 'Offset commit failed on partition com.application.iot.measure.stage-0 at offset 1053078427: The request timed out.'

java - sbt汇编上的Java OutOfMemoryError

java - JVM 在哪里持有我的文件锁?

scala - 为什么 Scala 在分配给 val 时需要部分应用柯里化(Currying)函数?

scala - 为什么 sbt compile 不会将非托管资源复制到类路径?