Quelqu'un pourrait-il me montrer un exemple rapide sur la manière de trier une ArrayList
alphabétiquement dans Java 8 à l'aide de la nouvelle syntaxe lambda.
Pour les chaînes cela fonctionnerait
arrayList.sort((p1, p2) -> p1.compareTo(p2));
Êtes-vous en train de trier String
s? Si c'est le cas, vous n'avez pas besoin de lambdas; il est inutile. Tu fais juste
import static Java.util.Comparator.*;
list.sort(naturalOrder());
... bien que si vous triez des objets avec un champ String
, alors cela a un peu plus de sens:
list.sort(comparing(Foo::getString));
Utilisez list.sort(String::compareToIgnoreCase)
Utiliser list.sort(String::compareTo)
ou list.sort(Comparator.naturalOrder())
donnera des résultats incorrects (c'est-à-dire non alphabétiques). Il va trier n'importe quelle lettre majuscule avant tout lettre minuscule, de sorte que le tableau ["aAAA","Zzz", "zzz"]
soit trié en ["Zzz", "aAAA", "zzz"]
Supposons que vous ayez une liste de noms (String) que vous souhaitez trier par ordre alphabétique.
List<String> result = names.stream().sorted(
Comparator.comparing(n->n.toString())).collect(Collectors.toList());
sa fonctionne parfaitement.
Une solution vraiment générique serait d’introduire un StreamUtil
comme
public class StreamUtil {
private StreamUtil() {
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <TYPE> Comparator<TYPE> sort(Function<TYPE, ? extends Comparable> getterFunction, boolean descending) {
if (descending) {
return (o1, o2) -> getterFunction.apply(o2).compareTo(getterFunction.apply(o1));
}
return (o1, o2) -> getterFunction.apply(o1).compareTo(getterFunction.apply(o2));
}
}
L'appel ressemblerait à quelque chose comme
list.stream().sorted(sort(YourClass::getSortProperty, true));
Le plus concis:
Collections.sort(stringList, String::compareToIgnoreCase);
En programmation fonctionnelle, vous n'utilisez pas les anciens objets pour les exploiter, mais créez le nouvel objet de la manière suivante:
list.stream().sorted().map(blah-blah).filter(...)...