Ich benutze Java Lambda, um eine Liste zu sortieren.
Wie kann ich es umgekehrt sortieren?
Ich habe diesen Beitrag gesehen , möchte aber Java 8 Lambda verwenden.
Hier ist mein Code (ich habe * -1 verwendet) als Hack
Arrays.asList(files).stream()
.filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
.sorted(new Comparator<File>() {
public int compare(File o1, File o2) {
int answer;
if (o1.lastModified() == o2.lastModified()) {
answer = 0;
} else if (o1.lastModified() > o2.lastModified()) {
answer = 1;
} else {
answer = -1;
}
return -1 * answer;
}
})
.skip(numOfNewestToLeave)
.forEach(item -> item.delete());
java
lambda
java-8
java-stream
Elad Benda2
quelle
quelle
-1 * answer
mitanswer
, wird die Reihenfolge der umgekehrt ändern , was mit ihm war-1 * ...
.forEachOrdered
anstelle vonforEach
forEachOrdered
kümmert sich, wie der Name schon sagt, um die Reihenfolge der Begegnungen, die relevant ist, da Sie eine bestimmte Anzahl der neuesten Dateien überspringen möchten, die von der Reihenfolge "Sortiert nach Änderungszeit" abhängt .sort
→skip
→ (ungeordnet)forEach
funktionieren sollte, richtig ist und dass es tatsächlich so implementiert ist, dass es in den heutigen JREs funktioniert, aber bereits 2015, als die vorherigen Kommentare abgegeben wurden, ist es so war in der Tat ein Problem (wie Sie in dieser Frage lesen können ).Antworten:
Sie können die in Wie sortiere ich ArrayList <Long> in Java verknüpfte Lösung in absteigender Reihenfolge anpassen ? indem man es in ein Lambda einwickelt:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
Beachten Sie, dass f2 das erste Argument von
Long.compare
und nicht das zweite ist, sodass das Ergebnis umgekehrt wird.quelle
Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
Kompilierungsfehlern :java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. Warum?comparingLong(Long::valueOf).reversed()
stattdessen versuchen . OderCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
stattObject
, was bedeutet , der Objekttyp sollte nicht verloren gehen. Aber eigentlich ist es das. Darüber bin ich verwirrt.comparingLong(Long::valueOf).reversed()
funktioniert, ebenfalls einen explizit typisierten Lambda-Ausdruck funktioniertcomparingLong((String v) -> Long.valueOf(v)).reversed()
funktioniert. Funktioniert auchStream.of("foo").mapToInt(s->s.length()).sum()
, da das"foo"
den eigenständigen Typ bereitstellt, während diesStream.of().mapToInt(s-> s.length()).sum()
fehlschlägt.Wenn Ihre Stream-Elemente implementiert werden,
Comparable
wird die Lösung einfacher:quelle
...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Comparable
.Collections.reverse
hat keine solche Einschränkung.Verwenden
Dann
quelle
Sie können eine Methodenreferenz verwenden:
Alternativ zur Methodenreferenz können Sie einen Lambda-Ausdruck verwenden, sodass das Argument des Vergleichs zu:
quelle
Alternative Wege teilen:
ASC
DESC
quelle
Dies kann leicht mit Java 8 und einem umgekehrten Komparator durchgeführt werden .
Ich habe eine Liste von Dateien aus einem Verzeichnis erstellt, die ich mit einem einfachen Komparator für die Sortierung unsortiert, sortiert und umgekehrt sortiert anzeige und dann reversed () aufrufe, um die umgekehrte Version dieses Komparators zu erhalten.
Siehe Code unten:
quelle
Sortieren Sie die Dateiliste mit Java 8 Collections
Beispiel für die Verwendung von Collections and Comparator Java 8 zum Sortieren einer Dateiliste.
quelle
Mit Comparator und Collection können Sie mit JAVA 8 ganz einfach in umgekehrter Reihenfolge sortieren
quelle
Für die umgekehrte Sortierung ändern Sie einfach die Reihenfolge von x1, x2, um die Methode x1.compareTo (x2) aufzurufen. Das Ergebnis ist umgekehrt
Standardreihenfolge
Umgekehrte Reihenfolge
quelle