实现多个接口
有时你可能希望有一个实现多个接口的 lambda 表达式。这对标记接口(例如 java.io.Serializable ) 非常有用,因为它们不添加抽象方法。
例如,你想创建一个 TreeSet
使用自定义 Comparator
,然后序列化,并把它在网络上。琐碎的方法:
TreeSet<Long> ts = new TreeSet<>((x, y) -> Long.compare(y, x));
因为比较器的 lambda 没有实现 Serializable
,所以不起作用。你可以通过使用交集类型并明确指定此 lambda 需要可序列化来解决此问题:
TreeSet<Long> ts = new TreeSet<>(
(Comparator<Long> & Serializable) (x, y) -> Long.compare(y, x));
如果你经常使用交集类型(例如,如果你使用的是 Apache Spark 等几乎所有内容都必须可序列化的框架 ),你可以创建空接口并在代码中使用它们:
public interface SerializableComparator extends Comparator<Long>, Serializable {}
public class CustomTreeSet {
public CustomTreeSet(SerializableComparator comparator) {}
}
这样就可以保证传递的比较器可以序列化。