lambda表达式是用来简化内部类书写的,啥是匿名内部类?
没有名字的接口实现。传统实现一个接口,由于接口是用来规范实现的,则要实现一个接口就得先有一个类来继承它,然后重写它的方法,要使用还得再new一个实现类的对象
通过匿名内部类实现这个接口就简化了这个过程,直接new一个对象,在new的过程中重写方法:
InterfaceDemo demo=new InterfaceDemo() {
@Override
public int add(int a, int b) {
return a+b;
}
};
//调用重写后的方法
System.out.println(demo.add(1,1));
说明:Demo是接口名称,重写了其中的int add()方法
Lambda最基础格式:(int a,int b)->{return a+b;}
InterfaceDemo demo =()->{
//方法体
}
三大部分:括号、右箭头、方法体
括号:用来描述参数列表,表示原始接口内方法的参数
右箭头:Lambda运算符,可以叫做箭头符号
方法体:方法重写,具体实现
大佬分水岭:精简Lambda的语法(规则)
1,参数类型可以省略,依据上面例子为例:
InterfaceDemo demo =(a,b)->{
return a+b;
}
2,假如只有一个参数,()括号可以省略
InterfaceDemo demo =a->{
//方法体
System.out.println("收到了参数a: " + a);
}
3,如果方法体只有一条语句,{}大括号可以省略,依据2再精简
InterfaceDemo demo =a->System.out.println("收到了参数a: " + a);
4,如果方法体中唯一的语句是return返回语句,那省略大括号的同时return也要省略,依据a+b的例子为例
InterfaceDemo demo =(a+b)->a+b;
防呆段落:上面的代码都是实现了一个匿名内部类,使用实现的方法:demo.方法名
方法引用语法:对象::方法,如果是static方法,语法:类名::方法
问题引入:对于一些类,它有些方法实现得很好,我看着眼红。或者我想把这个接口的方法集中起来,封装成通用方法放到一个类管理。这种情况就可以用到方法的引用,以下是步骤
1.先封装一个方法实现类
//此方法在一个ObjectDemo的类中
public int add(int a, int b){
return a+b;
}
2.用Lambda表达式进行方法引用
InterfaceDemo demo = ObjectDemo::add;
.3.调用InterfaceDemo接口的add方法
demo.add(1,1)
防呆段落:上面步骤3调用的是InterfaceDemo接口中的方法名,不是引用的方法名
构造方法引用:语法:类名::new,new后面不加任何东西了,具体引用哪个构造方法看接口内要实现的方法的参数情况
问题引入:为什么会用到构造方法引入?因为有可能某个类的构造方法恰好可以实现
具体实现和方法引用差不多
暂时没有用过