函数式接口
- ActionListener,Runnable,Comparator
- 我们把这些只拥有一个方法(default和static方法除外)的接口称为函数式接口,之前它们被称为SAM类型,即单抽象方法类型(Single Abstract Method)
- 我们并不需要额外的工作来声明一个接口是函数式接口:编译器会根据接口的结构自行判断(判断过程并非简单的对接口方法计数:一个接口可能冗余的定义了一个Object已经提供的方法,比如toString(),或者定义了static方法或default方法,这些都不属于函数式接口方法的范畴)。
- @FunctionalInterface注解
- API作者们可以通过该注解来显式指定一个接口是函数式接口(以避免无意声明了一个符合函数式标准的接口),加上这个注解之后,编译器就会验证该接口是否满足函数式接口的要求。
Java SE7的函数式接口
- Java SE 7的现有的类库大量使用了函数式接口,通过沿用这种模式,我们使得现有类库能够直接使用lambda表达式。例如下面是Java SE 7中已经存在的函数式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.beans.PropertyChangeListener
Java SE8的新增函数式接口
- Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:
- Predicate<T>——接收T对象并返回boolean
- Consumer<T>——接收T对象,不返回值
- Function<T, R>——接收T对象,返回R对象
- Supplier<T>——提供T对象(例如工厂),不接收值
- UnaryOperator<T>——接收T对象,返回T对象
- BinaryOperator<T>——接收两个T对象,返回T对象
特化函数式接口
- 除了上面的这些基本的函数式接口,我们还提供了一些针对原始类型(Primitive type)的特化(Specialization)函数式接口,例如IntSupplier和LongBinaryOperator。(我们只为int、long和double提供了特化函数式接口,如果需要使用其它原始类型则需要进行类型转换)同样的我们也提供了一些针对多个参数的函数式接口,例如BiFunction<T, U, R>,它接收T对象和U对象,返回R对象。
网友评论