La comparaison et la comparaison donnent une erreur de compilation

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 = new ArrayList<>(); classique List = new ArrayList<>(); . 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]));