Effective Java~44. 坚持使用标准的函数接口
在 java.util.Function 中有 43 個接口。不能指望全部記住它們,但是如果記住了六個基本接口,就可以在需要它們時派生出其余的接口。基本接口操作于對象引用類型。
Operator 接口表示方法的結果和參數類型相同。
Predicate 接口表示其方法接受一個參數并返回一個布爾值。
Function 接口表示方法其參數和返回類型不同。
Supplier 接口表示一個不接受參數和返回值 (或“供應”) 的方法。
Consumer 表示該方法接受一個參數而不返回任何東西,本質上就是使用它的參數。
六種基本函數式接口概述如下:
| 接口 | 方法 | 示例 |
| UnaryOperator<T> | T apply(T t) | String::toLowerCase |
| BinaryOperator<T> | T apply(T t1, T t2) | BigInteger::add |
| Predicate<T> | boolean test(T t) | Collection::isEmpty |
| Function<T,R> | R apply(T t) | Arrays::asList |
| Supplier<T> | T get() | Instant::now |
| Consumer<T> | void accept(T t) | System.out::println |
????????在處理基本類型 int,long 和 double 的操作上,六個基本接口中還有三個變體。 它們的名字是通過在基本接口前加一個基本類型而得到的。 因此,例如,一個接受 int 的 Predicate 是一個 IntPredicate ,而一個接受兩個long 值并返回一個 long 的二元運算符是一個 LongBinaryOperator 。 除 Function 接口變體通過返回類型進行了參數化,其他變體類型都沒有參數化。 例如, LongFunction<int[]> 使用 long 類型作為參數并返回了 int [] 類型。
????????Function 接口還有九個額外的變體,當結果類型為基本類型時使用。 源和結果類型總是不同,因為從類型到它自身的函數是 UnaryOperator 。 如果源類型和結果類型都是基本類型,則使用帶有 SrcToResult 的前綴Function ,例如 LongToIntFunction (六個變體)。如果源是一個基本類型,返回結果是一個對象引用,那么帶有 ToObj 的前綴 Function ,例如 DoubleToObjFunction (三種變體)。
????????有三個包含兩個參數版本的基本功能接口,使它們有意義: BiPredicate <T,U> , BiFunction <T,U,R> 和 BiConsumer <T,U> 。 也有返回三種相關基本類型的 BiFunction 變體: ToIntBiFunction <T,U> , ToLongBiFunction<T,U> 和 ToDoubleBiFunction <T,U> 。Consumer 有兩個變量,它們帶有一個對象引用和一個基本類型: ObjDoubleConsumer <T> , ObjIntConsumer <T> 和 ObjLongConsumer <T> 。 總共有九個兩個參數版本的基本接口。
????????最后,還有一個 BooleanSupplier 接口,它是 Supplier 的一個變體,它返回布爾值。 這是任何標準函數式接口名稱中唯一明確提及的布爾類型,但布爾返回值通過 Predicate 及其四種變體形式支持。 前面段落中介紹的 BooleanSupplier 接口和 42 個接口占所有四十三個標準功能接口。 無可否認,這是非常難以接受的,并且不是非常正交的。 另一方面,你所需要的大部分功能接口都是為你寫的,而且它們的名字是經常性的,所以在你需要的時候不應該有太多的麻煩。
????????大多數標準函數式接口僅用于提供對基本類型的支持。 不要試圖使用基本的函數式接口來裝箱基本類型的包裝類而不是基本類型的函數式接口。 雖然它起作用,但它違反了第 61 條中的建議:“優先使用基本類型而不是基本類型的包裝類”。使用裝箱基本類型的包裝類進行批量操作的性能后果可能是致命的。
總結
以上是生活随笔為你收集整理的Effective Java~44. 坚持使用标准的函数接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【itext学习之路】--6.将html
- 下一篇: Java消息服务~自动分配的消息头