来自JDK8的Comparator.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));
}
请注意,return语句的前缀是一个有趣的演员:(Comparator<T> & Serializable)
我已经意识到并且(我认为)理解:
&
运算符(并且可以在此处推断其目的),Serializable
界面。然而,在演员阵容中一起使用对我来说是令人困惑的。
如果返回类型不需要它,& Serializable
的目的是什么?
我不明白这个意图。
对欺骗/关闭请求的跟进:此问题How to serialize a lambda?不回答问题。我的问题特别注意到返回类型没有提到Serializable
,因此是我混淆的来源。
答案 0 :(得分:8)
Comparator.comparing()
的javadoc说:
如果指定的函数也是可序列化的,则返回的比较器是可序列化的。
强制转换确保Java用于实现lambda的内部类将implements Serializable
。