给定一个 List[Foo]
,其中 Foo
定义为:
case class Foo(bar: Option[String])
按字母顺序查找具有第一个 bar
的 Foo
的最佳方法是什么?
例如,如果我有:
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/