userList.stream().sorted((u1, u2) -> u2.getAge() – u1.getAge()); 怎么判断是升序还是降序?

如何判断 Java Stream API 中 sorted 方法的排序顺序?

在开发过程中,我们经常会使用 Java 的 Stream API 来对对象进行排序。例如:

userList.stream().sorted((u1, u2) -> u2.getAge() - u1.getAge());

本文将详细介绍如何通过比较器(Comparator)来判断这段代码是否为升序或降序排列,并解释其中的原理。

一、Lambda 表达式的排序规则

在 Stream.sorted() 方法中,传入的是一个 Comparator<T> 对象。其返回值决定了对象的排列顺序:

(sorted, (o1, o2) -> {
    if (o1 < o2) return -1; // 返回负数表示 o1 在 o2 前面
    else if (o1 > o2) return 1; // 返回正数表示 o1 在 o2 后面
    else return 0; // 返回 0 表示两者位置不变
});

二、具体应用实例

减法版数字排序

对于数值类型的比较,我们可以简化为简单的减法操作:

升序排列

userList.stream().sorted((u1, u2) -> u1.getAge() - u2.getAge());

上述代码中,o1 - o2 < 0 表示 u1 在 u2 前面;反之则在后面。因此,它是升序排列。

降序排列

userList.stream().sorted((u1, u2) -> u2.getAge() - u1.getAge());

在这种情况下,o2 - o1 > 0 表示 u2 在 u1 前面。所以这是降序排列。

字符串排序

同样的原理也适用于字符串的比较:

升序排列(字母从小到大)

list.stream().sorted((s1, s2) -> s1.compareTo(s2));

降序排列(字母从大到小)

list.stream().sorted((s1, s2) -> s2.compareTo(s1));

总结

通过上述实例可以看出,判断 Stream.sorted() 方法中的排序顺序主要依赖于 lambda 表达式中比较器的编写规则。具体来说:

  • 升序: 使用 o1 - o2 或 s1.compareTo(s2)。
  • 降序: 使用 o2 - o1 或 s2.compareTo(s1)。

掌握这些基础可以大大提高对 Java Stream API 的理解和使用效率,尤其在处理复杂的数据排序场景时会非常有用。