web-dev-qa-db-fra.com

Tri de ArrayList avec Lambda en Java 8

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.

31
Jeef

Pour les chaînes cela fonctionnerait

arrayList.sort((p1, p2) -> p1.compareTo(p2));
49
poosliver

Êtes-vous en train de trier Strings? 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));
26
Louis Wasserman

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"]

4
UTF_or_Death

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.

3
Sai prateek

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));
1
Chris311

Le plus concis:

Collections.sort(stringList, String::compareToIgnoreCase);
0
Faraz Durrani

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(...)...
0
Dmitry Ginzburg