如何使用Java8 lambda以相反的顺序对流进行排序?

Ela*_*da2 154 java lambda java-8 java-stream

我正在使用java lambda对列表进行排序.

我怎样才能以相反的方式对它进行排序?

我看到这篇文章,但我想使用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());
Run Code Online (Sandbox Code Playgroud)

Adr*_*ard 194

您可以调整您在如何按降序排序Java中的ArrayList <Long>中链接的解决方案通过将其包裹在lambda中:

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

请注意,f2是第一个参数Long.compare,而不是第二个参数,因此结果将被反转.

  • ...或`Comparator.comparingLong(File :: lastModified).reversed()` (200认同)
  • @Tiina:请参阅[Comparator.reversed()不能使用lambda进行编译](http://stackoverflow.com/q/25172595/2711488)。您可以尝试`comparingLong(Long :: valueOf).reversed()`。或`Collections.reverseOrder(comparingLong(v-&gt; Long.valueOf(v)))` (3认同)
  • @Tiina:它是*目标类型*的反向传播,它不起作用.如果您的链的初始表达式具有独立类型,它就像在Java 8之前一样通过链工作.正如您在比较器示例中所看到的,使用方法引用,即`comparisonLong(Long :: valueOf). reversed()`works,同样是一个显式类型的lambda表达式,作用`comparisonLong((String v) - > Long.valueOf(v)).reversed()`works.还有`Stream.of("foo").mapToInt(s-> s.length()).sum()`工作,因为``foo"`提供独立类型而`Stream.of(). mapToInt(s-> s.length()).sum()`失败. (3认同)
  • @Holger串流,并且具有`comparingLong(v-&gt; Long.valueOf(v))。reversed()`会引发编译错误:java.lang.valueOf(java.lang.String)不能用于java.lang .valueOf(java.lang.Object)`。为什么? (2认同)

GKi*_*lin 138

如果您的流元素实现,Comparable那么解决方案变得更简单:

 ...stream()
 .sorted(Comparator.reverseOrder())
Run Code Online (Sandbox Code Playgroud)

  • 对于集合中按日期进行比较的最新元素 `.stream().max(Comparator.comparing(Clazz::getDate))` (3认同)
  • 或`... stream()。max(Comparator.naturalOrder())` (2认同)
  • 如果元素不“可比较”怎么办?```Collections.reverse``` 没有这样的限制。 (2认同)

Vis*_*v K 53

使用

Comparator<File> comparator = Comparator.comparing(File::lastModified); 
Collections.sort(list, comparator.reversed());
Run Code Online (Sandbox Code Playgroud)

然后

.forEach(item -> item.delete());
Run Code Online (Sandbox Code Playgroud)

  • 好吧,他询问了溪流,但我仍然喜欢你的答案. (3认同)

iFe*_*erx 33

您可以使用方法参考:

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());
Run Code Online (Sandbox Code Playgroud)

在方法引用的替代方法中,您可以使用lambda表达式,因此比较的参数变为:

.sorted(comparing(file -> file.lastModified()).reversed());
Run Code Online (Sandbox Code Playgroud)


Cha*_*ang 15

替代方式分享:

ASC

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

DESC

List<Animal> animals = this.service.findAll();
animals = animals.stream().sorted(Comparator.comparing(Animal::getName).reversed()).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Sat*_*hia 6

简单地说,使用 Comparator 和 Collection,您可以使用JAVA 8相反顺序进行如下排序

import java.util.Comparator;;
import java.util.stream.Collectors;

Arrays.asList(files).stream()
    .sorted(Comparator.comparing(File::getLastModified).reversed())
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)