Saya menggunakan java lambda untuk mengurutkan daftar.
bagaimana saya bisa mengatasinya secara terbalik?
Saya melihat posting ini , tetapi saya ingin menggunakan java 8 lambda.
Ini kode saya (saya menggunakan * -1) sebagai peretasan
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
sumber
sumber
-1 * answer
dengananswer
, pesanan akan berubah untuk membalikkan apa itu dengan-1 * ...
.forEachOrdered
sebagai gantiforEach
forEachOrdered
, seperti namanya, peduli tentang pesanan pertemuan yang relevan seperti yang Anda ingin melewatkan sejumlah terbaru file yang bergantung pada “diurutkan berdasarkan waktu modifikasi” agar .sort
→skip
→ (tidak terurut)forEach
harus bekerja, benar dan bahwa memang diterapkan untuk bekerja dengan cara ini di JRE hari ini, tetapi kembali pada tahun 2015, ketika komentar sebelumnya dibuat, itu memang masalah (seperti yang Anda baca dalam pertanyaan ini ).Jawaban:
Anda dapat menyesuaikan solusi yang Anda tautkan di Cara menyortir ArrayList <Long> di Jawa dalam urutan menurun? dengan membungkusnya dalam lambda:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
perhatikan bahwa f2 adalah argumen pertama
Long.compare
, bukan argumen kedua, sehingga hasilnya akan terbalik.sumber
Comparator.comparingLong(File::lastModified).reversed()
comparingLong(v->Long.valueOf(v)).reversed()
melempar kompilasi error:java.lang.valueOf(java.lang.String) cannot be used on java.lang.valueOf(java.lang.Object)
. Mengapa?comparingLong(Long::valueOf).reversed()
sebagai gantinya. AtauCollections.reverseOrder(comparingLong(v->Long.valueOf(v)))
T
bukanObject
, artinya jenis objek tidak boleh hilang. Tapi sebenarnya itu. Itulah yang saya bingung.comparingLong(Long::valueOf).reversed()
bekerja, juga ekspresi lambda yang diketik secara eksplisit. bekerjacomparingLong((String v) -> Long.valueOf(v)).reversed()
bekerja. JugaStream.of("foo").mapToInt(s->s.length()).sum()
berfungsi, karena"foo"
menyediakan tipe yang berdiri sendiri sedangkanStream.of().mapToInt(s-> s.length()).sum()
gagal.Jika elemen aliran Anda diterapkan,
Comparable
maka solusinya menjadi lebih sederhana:sumber
...stream().max(Comparator.naturalOrder())
.stream().max(Comparator.comparing(Clazz::getDate))
Comparable
.Collections.reverse
tidak memiliki batasan seperti itu.Menggunakan
Kemudian
sumber
Anda dapat menggunakan referensi metode:
Sebagai alternatif referensi metode, Anda dapat menggunakan ekspresi lambda, sehingga argumen pembandingan menjadi:
sumber
Cara berbagi alternatif:
ASC
DESC
sumber
Ini dapat dengan mudah dilakukan menggunakan Java 8 dan penggunaan pembanding terbalik .
Saya telah membuat daftar file dari direktori, yang saya tampilkan tidak disortir, diurutkan, dan diurutkan mundur menggunakan pembanding sederhana untuk pengurutan dan kemudian memanggil dibalik () di atasnya untuk mendapatkan versi pembalik pembanding itu.
Lihat kode di bawah ini:
sumber
Urutkan daftar file dengan Koleksi java 8
Contoh cara menggunakan Collections and Comparator Java 8 untuk mengurutkan daftar File.
sumber
Secara sederhana, menggunakan Comparator dan Collection Anda dapat mengurutkan seperti di bawah ini dalam urutan pembalikan menggunakan JAVA 8
sumber
Untuk pemilahan terbalik, cukup ubah urutan x1, x2 untuk memanggil metode x1.compareTo (x2) hasilnya akan terbalik satu sama lain
Pesanan default
Urutan terbalik
sumber