scala - 如何使用 Option[String] 按字母顺序对案例类进行排序而忽略 None 的?

标签 scala

给定一个 List[Foo],其中 Foo 定义为:

case class Foo(bar: Option[String])

按字母顺序查找具有第一个 barFoo 的最佳方法是什么?

例如,如果我有:

val l = List(Foo(None), Foo(Some("xyz")), Foo(Some("abc")))

我想返回 Foo(Some("abc"))

最佳答案

   list.filter(_.bar.isDefined) match {
      case Nil => Foo(None)
      case l => l.minBy(_.bar)
   }

或者,如果总会有至少一个非空选项,那么只需 list.filter(_.bar.isDefined).minBy(_.bar)

这比排序(略微)好,因为它是线性的,不需要分配数据结构。

另一种可能性,甚至(稍微)更有效(但稍微复杂一点)是

list.reduceOption { 
    case (Foo(None), x) => x
    case (x, Foo(None)) => x
    case (Foo(Some(x)), Foo(Some(y))) => if ( x < y ) Foo(Some(x)) else Foo(Some(y))
}

关于scala - 如何使用 Option[String] 按字母顺序对案例类进行排序而忽略 None 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27572558/

相关文章:

postgresql - 无法将列的 266 :class java. math.BigDecimal 转换为 Long

java - Scala reduce 和 fold 返回 0 而不是一个值

scala - 如何以 Scala 方式执行此操作 : get the first element from Option[Seq[String]]

scala - 组合器/: in scala

java - 创建动态 mbean 分层树的简单方法?

generics - Scala 集合中的泛型类

scala - 是否可以使用反射来查找声明为 Scala 枚举子类型的字段的实际类型?

scala - 如何在 Netlogo 扩展中使用Optional

regex - 我如何在scala中选择具有指定模式的文件名

scala - 单个 Windows 机器上的多个 Spark Worker