it-swarm.com.de

Wie verwende ich ein Java8-Lambda, um einen Stream in umgekehrter Reihenfolge zu sortieren?

Ich benutze Java Lambda, um eine Liste zu sortieren.

wie kann ich es in umgekehrter Reihenfolge sortieren?

Ich habe das gesehen post , aber ich möchte 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());
142
Elad Benda2

Sie können die in verknüpfte Lösung anpassen. So sortieren Sie ArrayList <Long> in Java in absteigender Reihenfolge , indem Sie sie in ein Lambda einschließen:

.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())

beachten Sie, dass f2 das erste Argument von Long.compare ist, nicht das zweite, daher wird das Ergebnis umgekehrt.

187
Adrian Leonhard

Wenn Ihre Stream-Elemente Comparable implementieren, wird die Lösung einfacher:

 ...stream()
 .sorted(Comparator.reverseOrder())
120
GKislin

Verwenden

Comparator<File> comparator = Comparator.comparing(File::lastModified); 
Collections.sort(list, comparator.reversed());

Dann

.forEach(item -> item.delete());
50
Vishnudev K

Sie können eine Methodenreferenz verwenden:

import static Java.util.Comparator.*;
import static Java.util.stream.Collectors.*;

Arrays.asList(files).stream()
    .filter(file -> isNameLikeBaseLine(file, baseLineFile.getName()))
    .sorted(comparing(File::lastModified).reversed())
    .skip(numOfNewestToLeave)
    .forEach(item -> item.delete());

Alternativ zur Methodenreferenz können Sie auch einen Lambda-Ausdruck verwenden, sodass das Argument des Vergleichs wie folgt lautet:

.sorted(comparing(file -> file.lastModified()).reversed());
28
iFederx

Alternativer Weg zu teilen:

ASC

List<Animal> animals = this.service.findAll();
animals = animals.stream().sorted(Comparator.comparing(Animal::getName)).collect(Collectors.toList());

DESC

List<Animal> animals = this.service.findAll();
animals = animals.stream().sorted(Comparator.comparing(Animal::getName).reversed()).collect(Collectors.toList());
13
Chang

Dies kann einfach mit Java 8 und der Verwendung eines umgekehrten Komparators geschehen.

Ich habe eine Liste von Dateien aus einem Verzeichnis erstellt, die ich unsortiert, sortiert und rücksortiert mit einem einfachen Komparator für die Sortierung anzeige und dann umgekehrt () aufrufe, um die umgekehrte Version dieses Komparators zu erhalten.

Siehe Code unten:

package test;

import Java.io.File;
import Java.util.Arrays;
import Java.util.Comparator;
import Java.util.Date;
import Java.util.List;
import Java.util.stream.Collectors;

public class SortTest {
    public static void main(String... args) {
        File directory = new File("C:/Media");
        File[] files = directory.listFiles();
        List<File> filesList = Arrays.asList(files);

        Comparator<File> comparator = Comparator.comparingLong(File::lastModified);
        Comparator<File> reverseComparator = comparator.reversed();

        List<File> forwardOrder = filesList.stream().sorted(comparator).collect(Collectors.toList());
        List<File> reverseOrder = filesList.stream().sorted(reverseComparator).collect(Collectors.toList());

        System.out.println("*** Unsorted ***");
        filesList.forEach(SortTest::processFile);

        System.out.println("*** Sort ***");
        forwardOrder.forEach(SortTest::processFile);

        System.out.println("*** Reverse Sort ***");
        reverseOrder.forEach(SortTest::processFile);
    }

    private static void processFile(File file) {
        try {
            if (file.isFile()) {
                System.out.println(file.getCanonicalPath() + " - " + new Date(file.lastModified()));
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
4
ManoDestra

Dateiliste mit Java 8 Sammlungen sortieren

Beispiel für die Verwendung von Collections and Comparator Java 8 zum Sortieren einer Dateiliste.

import Java.io.File;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;
import Java.util.List;

public class ShortFile {

    public static void main(String[] args) {
        List<File> fileList = new ArrayList<>();
        fileList.add(new File("infoSE-201904270100.txt"));
        fileList.add(new File("infoSE-201904280301.txt"));
        fileList.add(new File("infoSE-201904280101.txt"));
        fileList.add(new File("infoSE-201904270101.txt"));

        fileList.forEach(x -> System.out.println(x.getName()));
        Collections.sort(fileList, Comparator.comparing(File::getName).reversed());
        System.out.println("===========================================");
        fileList.forEach(x -> System.out.println(x.getName()));
    }
}
2