Comparator.comparing的内部实现代码
时间: 2023-10-13 16:15:34 浏览: 69
程序实现时间排序Comparator
以下是Comparator.comparing方法的内部实现代码:
```java
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor) {
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
public static <T, U> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator) {
Objects.requireNonNull(keyExtractor);
Objects.requireNonNull(keyComparator);
return (Comparator<T> & Serializable)
(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2));
}
```
其中,第一个重载方法将传入的Function对象封装为一个新的Comparator对象,并使用lambda表达式实现了Comparator接口的compare方法。具体来说,该方法首先对传入的keyExtractor对象进行了非空判断,然后返回一个lambda表达式,该表达式接收两个输入对象c1和c2,分别将其通过keyExtractor对象映射为Comparable类型,并调用其compareTo方法进行比较。
第二个重载方法与第一个类似,但额外传入了一个Comparator对象keyComparator,用于指定null值的处理方式。在lambda表达式中,先调用keyExtractor对象将输入对象映射为U类型,然后调用keyComparator对象进行比较。
阅读全文