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


简要说明


jdk常用函数式接口

Predicate

@FunctionalInterface
public interface Predicate {
	boolean test(T t);
	
	default Predicate and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
	
	default Predicate negate() {
        return (t) -> !test(t);
    }
	
	default Predicate or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }
	
	static  Predicate isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}
  • predicate接口返回一个测试结果,结果类型为true或者false
  • predicate支持and、or、negate方法

Consumer

@FunctionalInterface
public interface Consumer {
	void accept(T t);
	 
	default Consumer 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 {
	R apply(T t);
	
	default  Function compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
	
	default  Function andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
	
	static  Function 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 get();
}
  • supplier 完全是一个凭空创造者,不需要任何输入,直接返回预期输出

使Lambda更精简

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