實現多個介面

有時你可能希望有一個實現多個介面的 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) {}
}

這樣就可以保證傳遞的比較器可以序列化。