函数式接口: 
 
    有且仅有一个抽象方法的接口就是函数式接口(Object中定义的方法除外、静态方法、默认方法都不关注) 
 
    使用注解:@FunctionalInterface可以去检查一个接口是否是函数式接口 
 
Lambda: 
 
    使用:用于简化匿名内部类,它本身不是匿名内部类。 
 
    组成: 
        一些参数 () 和被重写的方法的参数保持一致 
        一个箭头 -> 
        一段代码 {} 重写的方法要执行什么代码 
     
    lambda的简化格式: 
        1. 在参数列表中参数的类型可以省略 
        2. 如果参数只有一个,连参数外的小括号都可以省略 
        3. 如果重写方法中的代码只有一行,可以省略大括号分号和return 
            要么都省略要么都不省略 
     
    lambda优点: 
        1. 简化代码书写 
        2. 相比于匿名内部类,lambda不会生成class文件,一定程度上节约资源 
        3. 相比于普通的代码,lambda有延迟执行的效果,被调用的时候才执行 
 
常用的函数式接口: 
1. Supplier<T> 生产型接口 
 
        T get() 
2. Consumer<T> 消费型接口 
    void accept(T t) 
    默认方法: 
        andThen(Consumer after)  可以额外接收一个Consumer类型的数据,共同消费一个数据 
 
3. Predicate<T> 判断型接口 
    boolean test(T t) 
    默认方法: 
        and(Predicate other)  两个判断都需要满足结果才满足,相当于 && 
        or(Predicate other)  两个判断满足其一即可,相当于 || 
        negate()    取反 ! 
 
4. Function<T,R> 转换型接口 
    R apply(T t) 
    默认方法: 
        andThen(Function after) 
        compose(Function before) 
 
        f1.andThen(f2).apply(t); f1先执行转换,得到一个结果作为第二次转换的参数 
            等同于:f2.apply(f1.apply(t)) 
        f1.compose(f2).apply(t); 
 |   
        
 
    
    
    
     
 
 |