Scala排序选项

暗示

如果我有这样的案例课

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)

如果我要排序ListOption[String]降序排列,它只是简单的使用sortBy,然后reverse在列表中?

雷克斯·克尔

这是因为sorted但不是sortWith采用type的隐式参数Ordering,并且Ordering知道选项。使用sortWith,您就自己一个人。<你在一起也自己。

您可以笨拙地访问相同的机器:

l.sortWith((a,b) => Ordering[Option[String]].gt(a.bar,b.bar))

或通过导入获得更好的版本(但现在您可以Option根据它们的内容在任何地方比较s;希望这是您想要的):

import scala.math.Ordered._
l.sortWith((a,b) => a.bar > b.bar)

第一个是如此令人mouth目结舌,以至于除非您真的对性能有压力,否则它更容易做到.sorted.reverse.(而且,如果您确实对性能有压力,那么最好手动处理选项逻辑,例如a.bar.isEmpty || !b.bar.isEmpty || a.bar.get < b.bar.get。)

如果您要进行多种选择,那么为清晰起见,很难超越第二种。仅进行一项测试,我可能仍然会赞成.sorted.reverse

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章