如果我有这样的案例类
case class Foo(bar: Option[String])
为什么这样做
scala> val l = List(Foo(Some("b")), Foo(Some("a")), Foo(Some("c")))
l: List[Foo] = List(Foo(Some(b)), Foo(Some(a)), Foo(Some(c)))
scala> l.sortBy(_.bar)
res1: List[Foo] = List(Foo(Some(a)), Foo(Some(b)), Foo(Some(c)))
但不是这个
scala> l.sortWith((x,y) => x.bar > y.bar)
<console>:11: error: value > is not a member of Option[String]
l.sortWith((x,y) => x.bar > y.bar)
如果我想按降序对List
Option[String]
进行排序,使用sortBy
然后reverse
列表会更简单吗?
答案 0 :(得分:9)
这是因为sorted
但不是sortWith
采用类型Ordering
的隐式参数,而Ordering
知道选项。使用sortWith
,您就是自己的。使用<
,您也可以自己。
您可以笨重的方式访问相同的机器:
l.sortWith((a,b) => Ordering[Option[String]].gt(a.bar,b.bar))
或通过导入获得更好的版本(但现在您可以根据其内容比较Option
;希望这就是您想要的内容:
import scala.math.Ordered._
l.sortWith((a,b) => a.bar > b.bar)
第一个是如此满口,除非你真的要求表现,否则更容易.sorted.reverse.
。 (如果你真的被要求提高性能,你可能最好手动处理选项逻辑,例如a.bar.isEmpty || !b.bar.isEmpty || a.bar.get < b.bar.get
。)
如果你要进行多种选择,那么为了清晰起见,很难击败第二种。对于一次测试,我仍然可能赞成.sorted.reverse
。