「lambda表达式」Comparator接口

开发 前端
静态 comparing 方法取一个“ 键提取器” 函数, 它将类型 T 映射为一个可比较的类型 ( 如 String ) 。对要比较的对象应用这个函数, 然后对返回的键完成比较。例如,假设有一个 Person 对象数组,可以如下按名字对这些对象排序: Arrays.sort(people, Comparator.comparing(Person::getName));

Comparator 接口包含很多方便的静态方法来创建比较器。 这些方法可以用于 lambda 表达式或方法引用。

静态 comparing 方法取一个“ 键提取器” 函数, 它将类型 T 映射为一个可比较的类型 ( 如 String ) 。对要比较的对象应用这个函数, 然后对返回的键完成比较。例如,假设有一个 Person 对象数组,可以如下按名字对这些对象排序: Arrays.sort(people, Comparator.comparing(Person::getName));

与手动实现一个 Compamtor 相比, 这当然要容易得多。另外,代码也更为清晰, 因为显然我们都希望按人名来进行比较。

可以把比较器与 thenComparing 方法串起来。 例如:

Arrays.sort(people,
Comparator.comparing(Person::getlastName)
.thenComparing(Person::getFirstName));

如果两个人的姓相同, 就会使用第二个比较器。 这些方法有很多变体形式。可以为 comparing 和 thenComparing 方法提取的键指定一个 比较器。例如,可以如下根据人名长度完成排序:

Arrays.sort(people, Comparator.comparing(Person::getName,
(s, t) -> Integer.compare(s.length(), t.length()));

另外, comparing 和 thenComparing 方法都有变体形式,可以避免 int、 long 或 double 值 的装箱。要完成前一个操作, 还有一种更容易的做法:

Arrays.sort(people, Comparator.comparingInt(p -> p.getName().length()));

如果键函数可以返回 null , 可能就要用到 nullsFirst 和 nullsLast 适配器。这些静态方法会修改现有的比较器,从而在遇到 null 值时不会抛出异常, 而是将这个值标记为小于或 大于正常值。例如, 假设一个人没有中名时 getMiddleName 会返回一个 null, 就可以使用 Comparator.comparing(Person::getMiddleName(), Comparator.nullsFirst(… ) 。

nullsFirst 方法需要一个比较器,在这里就是比较两个字符串的比较器。naturalOrder 方法可以为任何实现了 Comparable 的类建立一个比较器。在这里,Comparator.naturalOrder() 正是我们需要的。下面是一个完整的调用, 可以按可能为 null 的中名进行排序。这里使用了一个静态导入 java.util.Comparator.* 以便理解这个表达式。注意 naturalOrder 的类型可以推导得出

Arrays.sort(people, comparing(Person::getMiddleName , nullsFirst(naturalOrder())));

静态 reverseOrder 方法会提供自然顺序的逆序。要让比较器逆序比较, 可以使用 reversed 实例方法。例如 naturalOrder().reversed() 等同于 reverseOrder()。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2009-09-15 15:18:00

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-11 09:48:27

Linq Lambda

2009-09-15 17:30:00

Linq Lambda

2009-09-17 10:40:22

Linq Lambda

2009-09-17 09:44:54

Linq Lambda

2009-08-27 09:44:59

C# Lambda表达

2012-06-26 10:03:58

JavaJava 8lambda

2024-03-25 13:46:12

C#Lambda编程

2024-03-08 09:45:21

Lambda表达式Stream

2013-04-07 15:44:26

Java8Lambda

2009-09-09 17:14:17

Linq lambda

2009-08-10 09:41:07

.NET Lambda

2013-04-10 10:58:19

LambdaC#

2009-08-26 16:17:23

C# Lambda表达

2009-09-17 09:09:50

Lambda表达式Linq查询

2009-08-27 09:57:50

C# Lambda表达

2009-08-31 17:11:37

Lambda表达式

2022-12-01 07:38:49

lambda表达式函数式

2023-07-31 07:43:07

Java语言表达式变量
点赞
收藏

51CTO技术栈公众号