Je suis en train de trier List
des employés par leur nom puis l'âge à l'aide Java8 Comparator
, j'ai créé ci-dessous Comparator
mais il me donne une erreur du compilateurcomparaison et thenComparing donne erreur de compilation
Type mismatch: cannot convert from Comparator<Object> to <unknown>
Comparator<String> c = Comparator.comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //compile error
mais cela fonctionne si je spécifie explicitement le Type
Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //works
ou en créant deux Compartor
s et de la chaîne
Comparator<String> name = Comparator.comparing(s -> s.split("\\s+")[0]);
Comparator<String> age = Comparator.comparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
Comparator<String> cc = name.thenComparing(age); //works
J'ai spécifié le type Comparator<String>
sur le côté gauche, mais pourquoi l'inférence de type automatique est de ne pas trouver le bon type et attend de spécifier explicitement.
Quelqu'un pourrait-il clarifier à ce sujet?
Voici le code
String[] arr = { "alan 25", "mario 30", "alan 19", "mario 25" };
Comparator<String> c = Comparator.<String, String> comparing(s -> s.split("\\s+")[0])
.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
List<String> sorted = Arrays.stream(arr).sorted(c).collect(Collectors.toList());
System.out.println(sorted);
sortie
[alan 19, alan 25, mario 25, mario 30]
Je ne suis pas un expert sur l'inférence de type générique, mais je devine que c'est juste « trop auto-inférence ». Probablement, il ne peut pas comprendre le type de la méthode 'comparison()' car il n'a aucun type à "ancrer" à, contrairement à la méthode de chaînage où vous donnez explicitement un type au résultat de 'comparaison () '. Quoi qu'il en soit, je pense qu'il serait plus lisible d'écrire votre propre 'comparateur ', et seulement d'appeler' split' une fois. Il n'y a pas de prix pour serrer le code dans le moins de lignes possibles. – ajb
La saisie de cible ne fonctionne pas via les appels de méthode chaînés, voir [ici] (http://stackoverflow.com/a/28834656/2711488) et [ici] (http://stackoverflow.com/a/26883991/2711488) et [ici] (http://stackoverflow.com/a/31383947/2711488). Cependant, vous pouvez simplement utiliser 'Comparator.comparing (s -> s.replaceFirst (" \\ s + "," "))' à la place de votre comparateur à deux étages et le résultat sera le même ... – Holger
'Comparator.comparing ((String s) -> s.split ("\\ s +") [0]). ThenComparingInt (s -> Integer.parseInt (s.split ("\\ s +") [1])) 'fonctionne mais pourquoi ce' String' est requis, il peut déduire de 'Comparator', est-ce une limitation dans l'inférence de type? BTW en utilisant «version java» 1.8.0_60 "' –
Saravana