Pourquoi Comparateur.la comparaison ne fonctionne pas avec String::toLowerCase méthode de référence?
Je suis en train de trier un tableau de Chaînes de caractères par ordre inverse (ignorant la casse), sans le modifier, et juste de l'imprimer. Je suis donc à l'aide de Java8 flux. Mais je n'arrive pas à le faire.
Voici ma tentative :
package experimentations.chapter02;
import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Collectors;
public class StringStream {
public static void main(String[] args) {
sortStrings();
}
public static void sortStrings(){
String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
System.out.println(
Arrays.stream(stringsArray)
.sorted(Comparator.comparing(String::toLowerCase).reversed())
.collect(Collectors.toList())
);
}
}
Le problème ici est que String::toLowerCase
n'est pas accepté dans la méthode statique Comparator.comparing
.
Pendant ce temps, j'ai réussi à trier le tableau, mais modifiant c':
public static void sortStrings(){
String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
System.out.println(
Arrays.stream(stringsArray)
.map(String::toLowerCase)
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList())
);
}
Alors, quelle est la plus simple solution de contournement?
- J'ai trouvé la solution : .triés((String e) -> adresse.toLowerCase) . Pendant ce temps, j'ai demandé la suppression de la poste, comme cela semble tellement évident pour moi de savoir, j'aurais trouvé sans avoir posé la question ...
- Votre premier extrait de code compile bien. Êtes-vous sur une vieille version de Java 8? Ou peut-être de la compilation dans eclipse? Le problème que vous mentionnez a été fixé à construire 129. Voir aussi stackoverflow.com/q/21751830/829571
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que Java ne peut pas déduire les types génériques pour certaines expressions complexes. La première déclaration de travaux, alors que la deuxième déclaration conduit à une erreur de compilation:
Il y a plusieurs façons de résoudre le problème. Voici trois d'entre eux:
Stocker l'intermédiaire Comparateur de dans une variable:
Utilisation
String.CASE_INSENSITIVE_ORDER
:Ajouter explicite des paramètres de type:
Arrays.stream(stringsArray).sorted(Comparator.comparing(String::toLowerCase).reversed()).collect(Collectors.toList())
compile avec javac/netbeans sur b132.System.out.println(System.getProperty("java.runtime.version"));
? J'ai1.8.0-b132
.System.out.println(Arrays.stream(stringsArray).sorted(Comparator.comparing(String::toLowerCase).reversed()).collect(Collectors.toList()));
java -version' prints
java version "1.8.0"; Java(TM) SE Runtime Environment (build 1.8.0-b132); Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)"."Object cannot be converted to Locale"
.String::toLowerCase
est surchargé, avec un no-arg version et une version qui prend unLocale
paramètre. Apparemment, le compilateur est d'avoir du mal à comprendre que le non-arg version est la bonne. (Je suis en utilisant la même construction que @nosid.)J'ai trouvé la solution :
Je pense que le problème avec la syntaxe
est que le compilateur s'attend alors à passer d'un Objet à l'instance de la méthode toLowerCase de la Chaîne. Donc j'ai besoin de faire mes propres lambda méthode, sans ignorer le type de paramètre lambda (String), sinon le compilateur ne pouvez toujours pas résoudre le problème.