J’essaie de sortinger la List
des employés par nom, puis par âge à l’aide de Java8 Comparator
, que j’ai créé ci-dessous, mais il me donne une erreur de compilation.
Type mismatch: cannot convert from Comparator to
Comparator c = Comparator.comparing(s -> s.split("\\s+")[0]) .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //comstack error
mais cela fonctionne si je spécifie explicitement le type
Comparator c = Comparator. comparing(s -> s.split("\\s+")[0]) .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); //works
ou en créant deux Compartor
et une chaîne
Comparator name = Comparator.comparing(s -> s.split("\\s+")[0]); Comparator age = Comparator.comparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); Comparator cc = name.thenComparing(age); //works
J’ai spécifié le type Comparator
sur le côté gauche mais la raison pour laquelle l’inférence de type automatique ne recherche pas le type correct et ne s’attend pas à spécifier explicitement.
Quelqu’un pourrait-il clarifier à ce sujet?
Voici le code
Ssortingng[] arr = { "alan 25", "mario 30", "alan 19", "mario 25" }; Comparator c = Comparator. comparing(s -> s.split("\\s+")[0]) .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1])); List sorted = Arrays.stream(arr).sorted(c).collect(Collectors.toList()); System.out.println(sorted);
sortie
[alan 19, alan 25, mario 25, mario 30]
Java a besoin de connaître un type de toutes les variables. Dans de nombreux lambdas, il peut en déduire un type, mais dans votre premier extrait de code, il ne peut pas deviner le type de s
. Je pense que la façon habituelle de résoudre ce problème serait de le déclarer explicitement:
Comparator c = Comparator.comparing((Ssortingng s) -> s.split("\\s+")[0]) .thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));
Si vous examinez cette réponse , elle contient une déclaration de type similaire dans l’argument de Comparator.comparing()
.
Votre méthode, donnant explicitement les arguments de type de comparing()
, fonctionne évidemment aussi.
Pour votre autre méthode, en déclarant deux comparateurs, je suis assez confiant que dans ce cas, Java peut déduire de la Ssortingng
à gauche de l’affectation, tout comme dans la List
classique List
. Lorsque vous appelez thenComparing()
dans la même expression, Java ne voit plus que le type à gauche est pertinent. Ce serait un peu comme int size = new ArrayList<>().size();
Cela fonctionne aussi:
Comparator name = Comparator.comparing(s -> s.split("\\s+")[0]); Comparator c = name.thenComparingInt(s -> Integer.parseInt(s.split("\\s+")[1]));