实现多个接口

有时你可能希望有一个实现多个接口的 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) {}
}

这样就可以保证传递的比较器可以序列化。