给定List [Foo],其中Foo定义为:
case class Foo(bar: Option[String])
对于我来说,使用第一个按字母顺序找到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)) }