實現多個介面
有時你可能希望有一個實現多個介面的 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) {}
}
這樣就可以保證傳遞的比較器可以序列化。