图解jdk1.8新特性(2)---Lambda

图解jdk1.8新特性(2)---Lambda

简要说明

图解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或者false
  • predicate支持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更精简

图解jdk1.8新特性(2)---Lambda

图解jdk1.8新特性(2)---Lambda

  • lambda表达式大部分情况下可以唯一确定参数的类型,所以可以省略参数类型只写参数名称
  • 当lambda表达式的表达式部分只包含一条语句的时候,可以省略大括号,return 语句以及句尾的分号
  • lambda表达式可以用前面所说的方法引用形式进一步简化

上一篇:Python谓词函数名称约定


下一篇:c – 使用其他类方法的std :: remove_if