Könnte mir jemand ein schnelles Beispiel zeigen, wie man eine Variable ArrayList
in Java 8 mit der neuen Lambda-Syntax alphabetisch sortiert.
Für Saiten würde das funktionieren
arrayList.sort((p1, p2) -> p1.compareTo(p2));
Sortierst du nur String
s? Wenn ja, brauchen Sie keine Lambdas; es bringt nichts. Du machst es einfach
import static Java.util.Comparator.*;
list.sort(naturalOrder());
... wenn Sie jedoch Objekte mit einem String
-Feld sortieren, ist dies etwas sinnvoller:
list.sort(comparing(Foo::getString));
Verwenden Sie list.sort(String::compareToIgnoreCase)
Die Verwendung von list.sort(String::compareTo)
oder list.sort(Comparator.naturalOrder())
führt zu falschen (dh nicht alphabetischen) Ergebnissen. Es sortiert alle Großbuchstaben vor alle Kleinbuchstaben, sodass das Array ["aAAA","Zzz", "zzz"]
in ["Zzz", "aAAA", "zzz"]
Angenommen, Sie haben eine Liste von Namen (String), die Sie alphabetisch sortieren möchten.
List<String> result = names.stream().sorted(
Comparator.comparing(n->n.toString())).collect(Collectors.toList());
es funktioniert perfekt.
Eine wirklich generische Lösung wäre, einige StreamUtil
-ähnliche einzuführen
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));
}
}
Der Anruf würde ungefähr so aussehen
list.stream().sorted(sort(YourClass::getSortProperty, true));
Am prägnantesten:
Collections.sort(stringList, String::compareToIgnoreCase);
Bei der funktionalen Programmierung verwenden Sie nicht die alten Objekte, um sie zu bearbeiten, sondern erstellen die neuen Objekte auf eine solche Weise:
list.stream().sorted().map(blah-blah).filter(...)...