J'aime les nouvelles méthodes d'usine statiques de Comparator
, car ils permettent de mettre en œuvre Comparateurs de manière très concise et moins sujette aux erreurs.Java 8: la mise en œuvre Comparable
Mais quelle est la méthode recommandée pour mettre en œuvre Comparable
? Devrions-nous utiliser des comparateurs dans la mise en œuvre comparable?
public MyClass implements Comparable<MyClass>{
...
public int compareTo(MyClass other){
Comparator<MyClass> naturalOrderComparator =
Comparator.comparing(MyClass::getFoo)
.thenComparing(MyClass::getBar);
return naturalOrderComparator.compare(this, other);
}
}
ou même utiliser un comparateur statique pour réduire un grand nombre de création d'objets lors du tri des collections énormes:
public MyClass implements Comparable<MyClass>{
private static final Comparator<MyClass> NATURAL_ORDER_COMPARATOR =
Comparator.comparing(MyClass::getFoo)
.thenComparing(MyClass::getBar);
...
public int compareTo(MyClass other){
return NATURAL_ORDER_COMPARATOR.compare(this, other);
}
}
Ou est-il un autre moyen recommandé de mettre en œuvre Comparable Java SE 8?
Ce sont de minuscules méthodes pratiques que vous pouvez facilement implémenter vous-même - l'appel de la statique Comparator n'est pas plus court. Pour les classes qui ont besoin de méthodes de comparaison intégrées, cela est inutile en termes de lisibilité et de brièveté, sans parler des performances. Vous pouvez consulter la source http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/Comparator.java#Comparator.comparingInt%28java.util. function.ToIntFunction% 29 – pvg
@pvg Quel est l'avantage d'implémenter moi-même des méthodes utilitaires en utilisant les méthodes statiques de Comparator? Pouvez-vous faire un échantillon qui est similaire concis? – Puce
Je recommande fortement votre deuxième option. L'écriture de ces choses vous-même est susceptible d'être plus sujette aux erreurs. –