图说jdk1.8新特性(2)--- Lambda
简要说明
jdk常用函数式接口
Predicate
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
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);
}
}
predicate
接口返回一个测试结果,结果类型为true或者falsepredicate
支持and、or、negate方法
Consumer
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
consumer
接口接受一个参数,然后对该参数做消费,返回void
consumer
支持通过andThen方法来进行链式调用消费
Function
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
Function
接口可以看做是一个工厂,接收原料得到产出
Function
接口可以通过compose方法进行前置调用,通过andThen方法进行后置调用,通过identity方法得到传入参数注意compose方法和andThen方法的参数定义中使用的<? super X> 和 <? extends X> , 使用的方式完全满足 PECS原则(produce extends consume super)
Supplier
@FunctionalInterface
public interface Supplier<T> {
T get();
}
supplier
完全是一个凭空创造者,不需要任何输入,直接返回预期输出
使Lambda更精简
- lambda表达式大部分情况下可以唯一确定参数的类型,所以可以省略参数类型只写参数名称
- 当lambda表达式的表达式部分只包含一条语句的时候,可以省略大括号,return 语句以及句尾的分号
- lambda表达式可以用前面所说的方法引用形式进一步简化
黎明前最黑暗,成功前最绝望!