函数式接口:
有且仅有一个抽象方法的接口就是函数式接口(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);
|
|