函数式编程
函数式接口—注解functioninterface
概述:有且仅有一个抽象方法的接口
特点:java中的函数式编程体现就是lambda,所以函数式接口就是可以适用于lambda使用的接口
简而言之:
1.函数式接口可以使用lambd表达式来表示该接口的对象
2.函数式接口可以使用@FunctionalInterface注解来标识该接口,如果不是函数式接口就不能使用@FunctionalInterface注解来标识该接口
格式:
@FunctionalInterface
public interface 接口名{
//只能定义一个抽象方法
}
注意:
1.一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,
否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。
2.没有标出注解,符合定义条件也是函数式接口
方法引用
概述“双冒号::为引用运算符,而它所在的表达式被称为方法引用
格式:
对象引用方法: 对象名::方法名
类名引用方法: 类名::方法名
super引用父类方法: super::方法名
this引用本类方法: this::方法名
类的构造器引用: 类名::new
数组的构造器引用: 数组类型::new 数据类型[]::new
当lambda表达式指定的解决方案只是使用一个对象调用成员方法,那么就可以使用对象名引用成员方法
当lambda表达式指定的解决方案只是使用一个类名调用静态方法,那么就可以使用类名引用静态方法
当lambda表达式指定的解决方案只是使用一个super调用父类的方法,那么就可以使用super引用父类方法
当lambda表达式指定的解决方案只是使用一个this调用本类方法,那么就可以使用this引用本类方法
当lambda表达式指定的解决方案只是使用一个类的构造器引用,那么就可以使用类名::new
当lambda表达式指定的解决方案只是使用一个数组的构造器引用,那么就可以使用数组类型::new(数据类型[] :: new)
使用场景
lambda表达式指定的解决方案其实就是调用另一个方法,那么这个时候就可以把lambda省略,直接把该方法引用过来
lambda表达式指定的解决方案已经在另一个方法中实现了,那么这个时候就可以吧lambda省略,直接把该方法引用
可推导可省略
如果使用Lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式——它们都将被自动推导。而如果使用方法引用,也是同样可以根据上下文进行推导。
通过对象名引用成员方法
通过类名引用静态方法
通过super引用父类的方法
构造器的引用
数组的引用