FunctionalInterface注解
FunctionalInterface`是Java8新增的一个注解,使用`FunctionalInterface`注解的接口被称为`函数式接口
@FunctionalInterface`注解的作用是告知编译器进行检查,可加可不加,但是如果加上了,那么接口必须为`函数式接口
特点
从FunctionalInterface
的Doc注释可知,函数式接口
具有以下特点
只能有一个抽象方法,但以下情况不计入
1、Java8自带的default方法
2、一个抽象方法重写了Object的一个公共方法
3、静态方法
比如下面这种情况
函数式接口类型
一般在java.util.function
包下我们可以看到所有的自带的符合函数式接口
的类型,主要有以下几种类型
Function
接收一个T类型的参数,返回一个R类型的结果
用法:
map.computeIfAbsent("name", String::length);
Function接口的andThen方法和compose方法
源码:
// 先执行before参数,再执行调用者(参数和调用者都是Function)
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
// 先执行调用者,再执行before参数((参数和调用者都是Function))
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
Consumer
接收一个T类型的参数,无返回结果
用法:
list.forEach(System.out::println);
源码:
// 消费参数t,消费规则自己定义
void accept(T t);
// 先执行调用者消费规则,再执行after参数的消费规则
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
Predicate
接收一个T类型的参数,返回一个boolean类型的结果
用法:
list.removeIf(a -> a == 3);
源码:
// 对给定参数执行断定规则,断定规则自己定义,断定结果为boolean
boolean test(T t);
// 先对给定参数执行当前断定规则,再执行other断定规则,两个断定规则都需要符合(可理解为条件A && 条件B),返回为Predicate
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
// 对test的断定规则取非,返回为Predicate
default Predicate<T> negate() {
return (t) -> !test(t);
}
// 先对给定参数执行当前断定规则,再执行other断定规则,两个断定规则符合一个即可(可理解为条件A || 条件B),返回为Predicate
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
// 返回一个谓词,用于测试两参数是否相等
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
Supplier
不接收参数,返回一个T类型的结果
用法:
Supplier<Random> randomSupplier = Random::new;
源码:
// 获取结果
T get();