方法引用
lambda表达式一种简写的方式
* lambda表达式:由接口申明和方法定义组成,
* 方法引用 方法的定义有符合接口定义的方法,不用重新定义方法。
方法引用基本使用方式:
- Class::new:获取该实例对象;
- Class::static_method:调用该class的静态方法;
- Class::method:调用该class的任意方法;
- instance::method:调用该实例的任意方法。
方法引用注意事项:
- 该 引用的函数 必定与 定义的接口 形参 和 返回值 类型一致;
- 调用静态方法 和 调用实例方法 时使用的 调用对象 是不一样的,一个是Class,一个是instance;
- 方法引用 有许多 函数式接口 的引用。
常用function: 具体详情可见 Java8-函数式编程- Function:接收一个输入参数,返回一个结果;
- BiFunction:接收两个参数, 返回一个对象;
- Consumer:接收一个输入参数,无返回操作;
- Predicate:接收一个输入参数,返回一个布尔值结果;
- Supplier:无参数,返回一个结果;
DEMO
public class FunctionRefer {
public static void main(String args[]){
Consumer<String> consumer = System.out::println;
/*
* 静态方法的引用或任意对象方法引用:Class::method
*/
//lambda表达式执行的过程
FunctionOperator functionOperator = (a,b) -> a*b;
//实现走(a,b)->a*b的return a*b;
consumer.accept("lambda 接口内部类实现 执行结果:"+functionOperator.sum(1,2));
//函数引用过程,因为在Math中有个静态方法
FunctionOperator functionOperator1 = Math::addExact;
// 1+2 实现方法走addExact();
consumer.accept("lambda 方法引用 执行结果:"+functionOperator1.sum(1,2));
// 特定对象的引用
FunctionRefer f=new FunctionRefer();
f.objectRefer();
}
public void objectRefer(){
Consumer<String> consumer = System.out::println;
//Class::new:获取该实例对象
Supplier<FunctionOperator> fun = FunctionReferImpl::new;
FunctionOperator functionOperator = fun.get();
consumer.accept("new 引用方式:"+functionOperator.sum(1,2));
// 接口引用 instance::method:调用该实例的任意方法
FunctionOperator functionOperator1 = functionOperator::sum;
consumer.accept("方法 引用方式:"+functionOperator1.sum(1,2));
}
}
/*
*内部接口定义
*/
interface FunctionOperator{
int sum(int a ,int b);
}
class FunctionReferImpl implements FunctionOperator{
@Override
public int sum(int a, int b) {
return a+b;
}
}
运行结果
lambda 接口内部类实现 执行结果:2
lambda 方法引用 执行结果:3
new 引用方式:3
方法 引用方式:3
方法引用暂时先写这么多,后面有学到再继续更新