如何使用 Java8 lambda 以相反的顺序对流进行排序?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28607191/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use a Java8 lambda to sort a stream in reverse order?
提问by Elad Benda2
I'm using java lambda to sort a list.
我正在使用 java lambda 对列表进行排序。
how can I sort it in a reverse way?
我怎样才能以相反的方式对其进行排序?
I saw this post, but I want to use java 8 lambda.
我看到了这篇文章,但我想使用 java 8 lambda。
Here is my code (I used * -1) as a hack
这是我的代码(我使用 * -1)作为 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());
采纳答案by Adrian Leonhard
You can adapt the solution you linked in How to sort ArrayList<Long> in Java in decreasing order?by wrapping it in a lambda:
您可以调整您在如何以降序对 Java 中的 ArrayList<Long> 进行排序中链接的解决方案?通过将其包装在 lambda 中:
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
.sorted((f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())
note that f2is the first argument of Long.compare
, not the second, so the result will be reversed.
请注意,f2是 的第一个参数Long.compare
,而不是第二个,因此结果将相反。
回答by Vishnudev K
Use
用
Comparator<File> comparator = Comparator.comparing(File::lastModified);
Collections.sort(list, comparator.reversed());
Then
然后
.forEach(item -> item.delete());
回答by iFederx
You can use a method reference:
您可以使用方法参考:
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());
In alternative of method reference you can use a lambda expression, so the argument of comparing become:
作为方法引用的替代方案,您可以使用 lambda 表达式,因此比较的参数变为:
.sorted(comparing(file -> file.lastModified()).reversed());
回答by Grigory Kislin
If your stream elements implements Comparable
then the solution becomes simpler:
如果您的流元素实现,Comparable
则解决方案变得更简单:
...stream()
.sorted(Comparator.reverseOrder())
回答by ManoDestra
This can easily be done using Java 8 and the use of a reversed Comparator.
这可以使用 Java 8 和反向Comparator轻松完成。
I have created a list of files from a directory, which I display unsorted, sorted and reverse sorted using a simple Comparator for the sort and then calling reversed() on it to get the reversed version of that Comparator.
我从一个目录中创建了一个文件列表,我使用一个简单的比较器进行排序显示未排序、排序和反向排序,然后对其调用 reversed() 以获取该比较器的反向版本。
See code below:
见下面的代码:
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());
}
}
}
回答by Chang
Alternative way sharing:
替代方式分享:
ASC
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());
回答by Jonathan Mendoza
Sort file list with java 8 Collections
使用 java 8 Collections 对文件列表进行排序
Example how to use Collections and Comparator Java 8 to sort a File list.
示例如何使用集合和比较器 Java 8 对文件列表进行排序。
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()));
}
}