2017-05-08 4 views
1

Je suis à la recherche d'un moyen simple et élégante pour convertir Java Comparator à scala Ordering.Convertir les fichiers Java à Scala Commande Comparator

utilisation:

J'ai une collection Scala que je veux trier en utilisant un comparateur défini dans le code Java:

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

Répondre

2

Il y a déjà y une conversion implicite dans la bibliothèque standard: scala.math.Ordering.comparatorToOrdering

Vous avez juste besoin d'une importation pour l'utiliser:

import scala.math.Ordering.comparatorToOrdering 

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

Si je ne me trompe pas, le compagnon Ordering contient implicitement conversion de comparable [A] à commande [A]:

Vous pouvez importer scala.math.Ordering.Implicits pour accéder à d'autres implic il commandes.

Exemple:

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

Ce qui est plus important, il est également implicite méthode 'Ordering.comparatorToOrdering' de sorte que vous n'avez pas besoin Faites-en un vous-même comme @Harper, il suffit de l'importer. voir http://www.scala-lang.org/api/2.12.0/scala/math/Ordering$.html#comparatorToOrdering[A](implicitcmp:java.util.Comparator[A]):scala.math.Ordering [UNE] – SergGr

1

La meilleure façon que je l'ai trouvé à ce jour est de définir votre propre conversion implicite entre java.util.Comparator et commande

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

Importer cela et vous peut écrire

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