如何使用Java8 lambda按相反顺序对stream进行sorting?

我使用java lambdasorting列表。

我怎样才能以相反的方式sorting呢?

我看到这个post ,但我想用java 8 lambda。

这里是我的代码(我用* 1)作为黑客

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()); 

您可以调整您链接的解决scheme如何按Java降序排列ArrayList <Long>? 通过包装在一个lambda:

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

请注意, f2Long.compare的第一个参数,而不是第二个参数,所以结果将相反。

使用

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

然后

 .forEach(item -> item.delete()); 

你可以使用一个方法引用:

 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()); 

在方法引用的替代方法中,可以使用lambdaexpression式,所以比较的参数变成了

 .sorted(comparing(file -> file.lastModified()).reversed()) 

顺便说一句:如果你的stream元素实现Comparable那么它变得很简单:

  ...stream() .sorted(Comparator.reverseOrder()) 

这可以很容易地使用Java 8和使用反转比较器来完成 。

我创build了一个目录中的文件列表,我使用一个简单的比较器进行sorting,然后调用reverse()来获取该比较器的反转版本,然后显示未sorting,sorting和反向sorting。

见下面的代码:

 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()); } } }