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)

如果我想按降序对Option [String]列表进行排序,那么使用sortBy然后反转列表会更简单吗?

解决方法

这是因为排序但不是sortWith采用Ordering类型的隐式参数,Ordering知道选项.使用sortWith,您可以自己动手.并且<你也是自己的. 您可以以笨重的方式访问相同的机器:

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

或者通过导入获得更好的版本(但现在您可以根据其内容比较选项;希望这就是您想要的):

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

一个是如此满口,除非你真的按性能,否则更容易只是.sorted.reverse ..(如果你真的要求性能,你可能会更好地手动处理选项逻辑,ega bar.isEmpty ||!b.bar.isEmpty || a.bar.get< b.bar.get.) 如果你要进行多种选择,那么为了清晰起见,很难击败第二种.对于一次测试,我仍然可能偏爱.sorted.reverse.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...