Java 8 Lambda: Comparateur
Je veux trier une liste avec Lambda:
List<Message> messagesByDeviceType = new ArrayList<Message>();
messagesByDeviceType.sort((Message o1, Message o2)->o1.getTime()-o2.getTime());
Mais j'ai eu cette erreur de compilation:
Multiple markers at this line
- Type mismatch: cannot convert from long to int
- The method sort(Comparator<? super Message>) in the type List<Message> is not applicable for the arguments ((Message o1, Message o2)
-> {})
Vous devez vous connecter pour publier un commentaire.
Comparator#compareTo
retourne unint
; tandis quegetTime
est évidemmentlong
.Ce serait mieux écrit comme ceci:
La
Comparator
'scompare()
méthode doit retourner unint
, et il semble que le vôtre est le retour d'unlong
.Vous pouvez le modifier:
C'est en supposant que (en fonction de votre message d'erreur) que
o1.getTime()
renvoie unelong
.Lambda
Le lambda peut être considéré comme l'abréviation d'un peu lourd classe anonyme:
Java8 version:
Pré-Java8 version:
Donc, chaque fois que vous êtes confus comment écrire un droit lambda, vous pouvez essayer d'écrire un pré-lambda version, et de voir comment cela est faux.
Application
À votre problème spécifique, vous pouvez voir l'
compare
retourneint
, où votregetTime
rendements de long, qui est la source de l'erreur.Vous pouvez utiliser soit la méthode que les autres répondre méthode, comme:
Avis
-
dansComparator
, ce qui pourrait provoquer un débordement, dans certains cas, et le plantage de votre programme.Comparateur de
Nous utilisons comparateur interface de trier homogène et de l'hétérogène par défaut, l'ordre de tri personnalisé.
Les Classes Anonymes comment trier une liste d'objets dans les versions antérieures de Java 8 à l'aide de Classes internes.
Une classe anonyme ne peut pas accéder aux variables locales dans son cadre englobant qui ne sont pas déclarés comme finale ou efficacement final.
Java 8
Expressions Lambda
uing la méthode de comparaisonDe base de Tri avec le Soutien de Lambda
À l'aide de Extrait la Clé et La comparaison de la méthode: Un comparateur qui compare par un extrait la clé. Passer des références à l'aide de :: mot-clé.
Test De L'Échantillon De Code:
Voir ces messages aussi:
Vous devriez changer
à
Qui suppose que la valeur est
Comparable
, qui fournit un cadre naturel de l'ordre de tri.Si vous voulez ajouter plus de champs, alors vous pouvez peut de la chaîne d'eux sur le Comparateur. par exemple, pour trier d'abord par le temps, et puis par l'expéditeur:
Pour inverser l'ordre de toute
Comparator
, la chaîne de lareveresed()
méthode, par exemple pour trier d'abord par le temps décroissant, puis par l'expéditeur:Voir aussi https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
La méthode compare() doit retourner un int, et il semble que la vôtre est de retour d'une longue.
Vous pouvez le changer en:
De Long.comparer(o1.getTime(),o2.getTime())
Bien expliqué concernant lambda comparateur de dans la ci-dessous présenté par liaison vidéo.
https://youtu.be/r7mYbTmWtUg