scala - 获取 List[Option[Int 或 Long 或 Float]] 中的最小值和最大值

标签 scala

我正在尝试获取有序数字列表中的最小值和最大值。 使用特定类型时没有问题:

private def minMaxValue (valuesList: List[Option[Int]], min: Boolean): Option[Int] = 
  valuesList.flatten match {
  case Nil => None
  case xs => Some(if (min) xs.min else xs.max)
}

但是当我找不到将其更改为也接受 Long 和 Float 的方法时,我尝试了:

private def minMaxValue (valuesList: List[Option[Any]], min: Boolean): Option[Int] = 
  valuesList.flatten match {
  case Nil => None
  case xs: List[Int] => Some(if (min) xs.min else xs.max)
  case xs: List[Long] => Some(if (min) xs.min else xs.max)
}

但它不起作用,我收到此警告

  • non-variable type argument Int in type pattern List[Int] (the underlying of List[Int]) is unchecked since it is eliminated by erasure

在 scala 中解决这个问题的最佳方法是什么?

最佳答案

我会这样做:

def minMaxValue[T <% Ordered[T]](valuesList: List[Option[T]], min: Boolean): Option[T] = 
  valuesList.flatten match {
    case Nil => None
    case xs => Some(if (min) xs.min else xs.max)
  }

这将创建一个带有类型参数T的泛型函数。您必须声明 T 是有序类型,以便编译器可以证明 T 的集合具有 minmax 方法。

它适用于整数和 double :

scala> minMaxValue(List(Option(1), None, Option(3)), false)
res7: Option[Int] = Some(3)

scala> minMaxValue(List(Option(1.0), None, Option(3.0)), false)
res8: Option[Double] = Some(3.0)

scala> minMaxValue(List(Option(1.0), None, Option(3.0)), true)
res9: Option[Double] = Some(1.0)

JVM 中类型删除的问题是类型参数仅在编译时可用,而在运行时不可用。在我的解决方案中,编译器会看到类型 T ,并可以使用该信息进行类型检查并生成适用于您正在使用的 T 特定值的函数。在代码中,您需要在运行时判断某些内容是 List[Int] 还是 List[Long],但那时该信息已被删除。

关于scala - 获取 List[Option[Int 或 Long 或 Float]] 中的最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194405/

相关文章:

scala - 从 sbt 任务中的 stdin 读取

scala - 如何为某些依赖项指定不同的解析器

scala - Scala 中的链接类型

scala - 将参数传递给特征

list - Scala:替代列表语法(如果可能,使用方括号)

Scala:这是 LinkedListLike 特征中的错误吗?

java - 从 Spark 2.0 中的逗号分隔字符串行中获取不同的项目

scala - 如何深入比较scala.js中的两个类似js的对象?

scala - 如何优雅地终止 Spark 应用程序

scala - hbase-spark 加载数据引发 NullPointerException 错误(scala)