Lambda 将自定义比较器替换为Comparator.Comparating()-为什么这样做?
我有一个Lambda 将自定义比较器替换为Comparator.Comparating()-为什么这样做?,lambda,java-8,java-stream,comparator,Lambda,Java 8,Java Stream,Comparator,我有一个列表,会议如下: public class Meeting { private Calendar date; public Calendar getDate() { return this.date } } 在中,最初在流的.sorted()部分中有一个自定义lambda比较器(myMeetingList是列表): 我完全是偶然发现了什么东西。我认为它有效,但我不知道为什么。我没有创建自定义比较器,而是将其替换为静态方法引用: return myMe
列表
,会议如下:
public class Meeting {
private Calendar date;
public Calendar getDate() {
return this.date
}
}
在中,最初在流的.sorted()
部分中有一个自定义lambda比较器(myMeetingList
是列表
):
我完全是偶然发现了什么东西。我认为它有效,但我不知道为什么。我没有创建自定义比较器,而是将其替换为静态方法引用:
return myMeetingList.parallelStream()
.filter(m -> m.getContacts().contains(contact))
.sorted(Comparator.comparing(Meeting::getDate))
.collect(Collectors.toList());
我相信这是有效的,但我真的不知道为什么。Comparator.comparing()实现之一的JavaDoc显示
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
static比较器中的代码。比较
只是:
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
将执行
c1.getDate()
因此,最终结果基本上与原始代码相同。比较器中的代码。比较
只是:
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
将执行
c1.getDate()
因此,最终结果基本上与原始代码相同。谢谢,所以本例中的比较器是比较器?是
T
将被推断为Calendar
谢谢,因此本例中的比较器是比较器?是T
将被推断为Calendar