认识Lambda表达式:
Lambda表达式是一种用于简化匿名内部类书写方法的表达式。前提:被简化的匿名内部类必须是函数式接口。
函数式接口:1.必须定义成接口。
2.该接口中有且仅有一个方法。
匿名内部类:new(){
方法名{
方法体语句}
};
匿名内部类常用于子类需要调用父类中的某个方法,但是要求功能不同,这时我们会将父类中的方法定义成抽象方法,同时将父类定义成抽象方法,通过子类对其进行重写,再定义对象去调用,匿名内部类省去了先重写再创建对象再调用的繁琐过程。例:
abstract class Animal{
public abstract void cry();
}
class Dog extends Animal {
@override
public void cry(){
system.out.peintln("狗叫");
};
}
public static void main(String[] args){
Dog d = new dog;
dog.cry();
//使用匿名内部类
Animal d2 = new Animal(){
@override
public void cry(){
system.out.peintln("狗叫");
}
};
d2.cry();
}
可以看出,使用匿名内部类明显方便许多,二lambda表达式则是在匿名内部类的写法上再进一步简化。
格式: (被重写方法的形参列表)->{被重写方法的方法体
};
还是以上面的代码为例:
public static void main(String[] args){
Animal dog = () ->{
system.out.printlnn("狗叫");
};
dog.cry();
}
到底谁更方便,一目了然。
但是这里有一个问题,就是上面定义的类不满足lambda表达式的前提,即:被简化的匿名内部类必须是函数式接口。
很显然,上面的是类不是接口,所以这样写会报错。
因此,我们应该定义一个接口,并在只里面放一个函数。这样就可以书写lambda表达式了。
interface Swimming{
//大部分函数式接口都会有这个标志,看到就表明该接口可以用lambda表达式书写!
@Functionallinterface
void swim();
}
public static void main(String[] args){
Swimming s1 = () ->{
system.out.println("游泳使我快乐");
};
s1.swim();
}
我们再来看一个例子:
public static void main(String[] args){
double [] price = {99,120,65,100};
//这个方法的作用是把所有数据都打八折然后又存进去(这里的IntToDoubleFunction为函数式接口)
Arrays.setAll(price, new IntToDoubleFunction() {
@Override
public double applyAsDouble(int value) {
return value*0.8;
}
});
System.out.println(Arrays.toString(price));
//很显然,上面的代码肯定可以用lambda表达式进行书写
Arrys.setAll(price,(int value)->{
return value*0.8};)
System.out.println(Arrays.toString(price));
}
然而这就是lambda表达式最简洁的书写方式了吗,不!还可以简化!
lambda表达式的三条简化规则:
1.参数类型可以省略不写。
2.如果只有一个参数类型,还可以省略括号。(注意:必须是只有一个参数的条件下!多个参数去掉括号会报错!切记!!!)
3.如果方法体中只有一行代码,可以去掉方法体,同时如果此句为return语句,还可以把return语句也去掉!(简单理解:跟if语句后只有一行代码时不用写{}类似)
于是上面的代码我们就可以简化成这样:
public static void main(String[] args){
double [] price = {99,120,65,100};
//这个方法的作用是把所有数据都打八折然后又存进去(这里的IntToDoubleFunction为函数式接口)
Arrays.setAll(price, new IntToDoubleFunction() {
@Override
public double applyAsDouble(int value) {
return value*0.8;
}
});
System.out.println(Arrays.toString(price));
//lambda表达式简化(终极版):
Arrays.setAll(price,value -> value*0.8);
}
以上就是lambda表达式的所有内容,此文章为个人学习时所做的笔记,欢迎各位大佬来纠错和讨论。