《Effective Java》 第44条:坚持使用标准的函数接口
一、6个基本函数接口
java.util.function
包下共有43个接口。别指望能全部记住它们,但是如果能记住其中6个基本接口,必要时就可以推断出其余接口了。
基础接口作用于对象引用类型:【6】
UuaryOperator
、BinaryOperator
接口代表其结果与参数类型一致的函数。Predicate
接口代表带有一个参数并返回一个boolean的函数。Function
接口代表其参数与返回的类型不一致的函数。Supplier
接口代表没有参数并且返回(或者”提供“)一个值的函数。Consumer
接口代表带有一个不返回任何值得函数,相当于消费掉了其参数。
这6个基本函数接口概述如下:
接口 | 函数签名 | 范例 |
---|---|---|
UuaryOperator | T apply (T t) | String::toLowerCase |
BinaryOperator | T apply (T t1, T t2) | BigInteger::add |
Predicate | boolean test(T t) | Collection::isEmpty |
Function<T, R> | R apply(T t) | Arrays::asList |
Supplier | T get() | Instant::now |
Consumer | void accept(T t) | System.out::println |
二、基本函数接口的变体
这6个基础接口各自有3种变体【18】,分别可以作用于基本类型int、long和double。它们的命名方式是在其基础接口名称前面加上基本类型而得。
例如:
IntPredicate
: 带有int的predicate接口。LongUnaryOperator
:一个二进制运算符带有两个long值参数并返回一个long值。LongFunction<R>
:LongFunction<int[]>
表示带有一个long参数,并返回一个 int[] 数组。
这些变体接口的类型都不是参数化的,除了Function
变体外,后者是以返回类型为参数。
Function
接口还有9种变体【9】,用于结果类型为基本类型的情况。源类型和结果类型始终不一样,因为从类型到自身的函数就是UnaryOperator
。如果源类型和结果类型均为基本类型,就是在Function前面添加格式Src To Result,如LongToIntFunction
(有6种变体)。如果源类型为基础类型,结果类型是一个对象参数,则要在Function前添加Src To Obj,如DoubleToObjFunction
(有3种变体)。
这三种基础函数接口还有带两个参数的版本,如BiPredicate<T, U>
、BiFunction<T, U, R>
、BiConsumer<T, U>
。
BiFunction<T, U, R>
回返是基础类型的三个变体:
ToIntBiFunction<T, U>
ToLongBiFunction<T, U>
ToDoubleBiFunction<T, U>
Consumer
接口也有带两个参数的变体版本,它们带一个对象引用和一个基础类型:
ObjDoubleConsumer<T>
ObjIntConsumer<T>
ObjLongConsumer<T>
总之,这些基础接口有9种带两个参数的版本【9】。
最后,还有BooleanSupplier
接口【1】,它是Supplier接口的一种变体,返回boolean值。这是在所有的标准函数接口名称中唯一显式提到boolean类型的,但boolean返回值是通过Predicate及其4种变体支持的。
这样总共就是43【6+18+9+9+1】个标准函数接口。显然,这是个大数目,但是它们之间并非纵横交错。另一方面,你需要的函数接口都替你写好了,它们的名称都是循规蹈矩的,需要的时候并不难找到了。
引用–《Effective Java》中文版(原书第3版)[美](Joshua Bloch)著 俞黎敏 译