2017-05-08 56 views
1

我在查找简单优雅的方式将Java Comparator转换为scala Ordering将Java比较器转换为Scala Ordering

使用案例:

我有我想用Java代码中定义一个比较排序Scala的集合:

val comparator = getComparator() 
val collection = Seq("a","b") 
collection.sorted(???) 

回答

2

有读取Ÿ在标准库的隐式转换:scala.math.Ordering.comparatorToOrdering

你只需要导入使用它:

import scala.math.Ordering.comparatorToOrdering 

val comparator = getComparator() 
val collection = Seq("a","b") 
collection.sorted(comparator) 
2

如果我没有记错的话,在Ordering伴侣包含一个隐含的从比较[A]到订购[A]的转换:

您可以导入scala.math.Ordering.Implicits以获取对其他隐含它的顺序。

例子:

import java.util.Date 

val dateOrdering = implicitly[Ordering[Date]] 
import dateOrdering._ 

val now = new Date 
val later = new Date(now.getTime + 1000L) 

now < later ... should be true 
+1

更重要的还有隐含'Ordering.comparatorToOrdering'方法,所以你不必让@Harper自己做,只需导入它。请参阅http://www.scala-lang.org/api/2.12.0/scala/math/Ordering$.html#comparatorToOrdering[A](implicitcmp:java.util.Comparator[A]):scala.math.Ordering [一个] – SergGr

1

到目前为止,我已经找到了最好的方法是定义自己的隐含了java.util.Comparator之间和订货

implicit def comparatorToOrdering[T](comparator: Comparator[T]) = 
new Ordering[T] { 
    def compare(x: T, y: T): Int = comparator.compare(x, y) 
} 

导入这个和转换,那么你可以写

val comparator = getComparator() 
val collection = Seq("a","b") 
collection.sorted(comparator)