Sam*_*Sam 10 scala implicit option
如果我有两个选项,如
val a = Option(2)
val b = Option(1)
Run Code Online (Sandbox Code Playgroud)
我可以写
List(a,b).sorted
Run Code Online (Sandbox Code Playgroud)
并通过插入隐式排序来正确排序.如何获得对此订购的引用,以便我可以调用compare(a,b)并获得结果?我想要相当于
val comparison = a.compare(b)
Run Code Online (Sandbox Code Playgroud)
除非a和b是有序的实例.
dlw*_*lwh 15
您可以直接询问隐含的排序:
Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.
scala> implicitly[Ordering[Option[Int]]]
res0: Ordering[Option[Int]] = scala.math.Ordering$$anon$3@501a9177
scala> res0.compare(Some(1), Some(3))
res1: Int = -1
Run Code Online (Sandbox Code Playgroud)
操作选项的最佳方式是使用for表达式。
for (a1 <- a; b1 <- b) yield a1.compare(b1) // Some(-1)
Run Code Online (Sandbox Code Playgroud)
如果至少有一个数字是None,则结果是None。
val x: Option[Int] = None
for (a1 <- a; b1 <- x) yield a1.compare(b1) // None
Run Code Online (Sandbox Code Playgroud)
比较函数可以定义为
def compare(a: Option[Int], b: Option[Int]) = {
for (a1 <- a; b1 <- b) yield a1.compare(b1)
}.get
Run Code Online (Sandbox Code Playgroud)
更新:
如果你想要 Nones 你可以使用模式匹配:
def compare(a: Option[Int], b: Option[Int]) = (a, b) match {
case (Some(a), Some(b)) => a.compare(b)
case (None, None) => 0
case (None, _) => -1 // None comes before
case (_, None) => 1
}
val list: List[Option[Int]] = List(List(Some(1), None, Some(4), Some(2), None))
val list2 = list.sortWith(compare(_, _) < 0)
// list2 = List(None, None, Some(1), Some(2), Some(4))
Run Code Online (Sandbox Code Playgroud)