Używam java lambda do sortowania listy.
jak mogę to posortować w odwrotny sposób?
Widziałem ten post , ale chcę użyć java 8 lambda.
Oto mój kod (użyłem * -1) jako 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
źródło
źródło
-1 * answer
sięanswer
kolejność zmieni się odwrócić tego, co było z-1 * ...
.forEachOrdered
zamiastforEach
forEachOrdered
, jak sama nazwa wskazuje, dba o kolejność spotkań, która jest istotna, ponieważ chcesz pominąć pewną liczbę najnowszych plików, która opiera się na kolejności „sortowania według czasu modyfikacji” .sort
→skip
→ (nieuporządkowane)forEach
powinno działać, jest poprawne i że rzeczywiście zostało wdrożone, aby działało w ten sposób w dzisiejszych JRE, ale w 2015 r., Kiedy pojawiły się poprzednie komentarze, to rzeczywiście był problemem (jak można przeczytać w tym pytaniu ).Odpowiedzi:
Możesz dostosować rozwiązanie, które podłączyłeś w Jak sortować ArrayList <Long> w Javie w malejącej kolejności? zawijając go w lambda:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
zwróć uwagę, że f2 jest pierwszym argumentem
Long.compare
, a nie drugim, więc wynik zostanie odwrócony.źródło
Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
wyrzuca błąd kompilacji:java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. Czemu?comparingLong(Long::valueOf).reversed()
. LubCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
zamiastObject
, co oznacza, że typ obiektu nie powinien zostać utracony. Ale tak naprawdę jest. Właśnie o to się mylę.comparingLong(Long::valueOf).reversed()
Działa, podobnie jak jawnie wpisane wyrażenie lambda działacomparingLong((String v) -> Long.valueOf(v)).reversed()
działa.Stream.of("foo").mapToInt(s->s.length()).sum()
Działa również , ponieważ"foo"
zapewnia typ autonomiczny, podczas gdyStream.of().mapToInt(s-> s.length()).sum()
nie działa.Jeśli elementy strumienia zostaną zaimplementowane,
Comparable
rozwiązanie stanie się prostsze:źródło
...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Comparable
.Collections.reverse
nie ma takiego ograniczenia.Posługiwać się
Następnie
źródło
Możesz użyć odwołania do metody:
Alternatywnie do odwołania do metody możesz użyć wyrażenia lambda, więc argumentem porównania jest:
źródło
Alternatywny sposób udostępniania:
ASC
DESC
źródło
Można to łatwo zrobić za pomocą Java 8 i odwróconego komparatora .
Utworzyłem listę plików z katalogu, które wyświetlam nieposortowane, posortowane i posortowane odwrotnie za pomocą prostego komparatora do sortowania, a następnie wywołując na nim reverse (), aby uzyskać odwróconą wersję tego komparatora.
Zobacz kod poniżej:
źródło
Sortuj listę plików za pomocą java 8 kolekcji
Przykład korzystania z kolekcji i komparatora Java 8 do sortowania listy plików.
źródło
W prosty sposób, używając Komparatora i Kolekcji, możesz sortować jak poniżej w odwrotnej kolejności za pomocą JAVA 8
źródło
W przypadku sortowania wstecznego wystarczy zmienić kolejność x1, x2 w celu wywołania metody x1.compareTo (x2), wynik będzie odwrócony względem siebie
Domyślne zamówienie
Odwrotna kolejność
źródło