Java8在提供了lambda 的同時也提供了標準的函數接口,在java.util.function 中提供了大量的標準函數接口。只要標準的函數接口能夠滿足需求,通常應該優先考慮,而不是專門再構建一個新的函數接口。
其中有六個是基礎接口,其他的接口可以由基礎接口推斷出:
image.png
如常用的接口BiFunction:
BifunctionTest
使用時需要注意:
- 不要使用帶包裝類型的基礎函數接口來代替基本函數。它破壞了基本類型優于裝箱類型的原則。批量處理裝箱基本類型時可能會有嚴重的性能問題。
- 在自己編寫函數接口時,一定要始終使用@FunctionalInterface注釋來注釋接口。避免后續維護人員不小心給該接口添加抽象方法。
且一定要滿足下面三條原則:
a.通用,并可從描述性名稱中受益。
b.有與其關聯的強約定
c.受益于定制的缺省方法
- 不要給相同參數位置,提供不同的函數接口來進行重載。它會在客戶端導致歧義。
在日常開發中,其實主要使用的還是標準函數接口,如Supplier、Consumer、Bifunction等。反而是自己編寫函數方法還沒有具體實踐過,目前也還沒有想到滿足上述原則的場景,如果之后遇見可以嘗試下。