lambda表达式:
在学习lambda表达式之前,我们可以了解一下函数式编程思想:
对于函数时思想:它会尽量忽略面向对象的语法:强调做什么,而不是以什么形式去做,现在学习的lambda表达式就是函数式编程思想的集中体现。
格式
()->():左边括号中是形参,右边的括号中则是代码块,☞具体需要做的事,中间的则是指向动作
形参:
1,形参是多个,参数之间需要使用逗号隔开,参数类型可以省略,但是不要只省略一个,要省略都得省略;
2,如果没有参数则只留个空括号就行;
3,如果只有一个参数,可以将左边的括号进行一个省略,做到一个简化,同时参数类型也可以省略
需要注意一点就是:写lambda表达式的时候必须要有接口,并且要求接口中有且仅有一个抽象方法,所以在同等条件下,它可以很好的替代匿名内部类,可以使代码得到相应的简化。
现在可以几个例子熟悉lambda表达式,并通过对比来看看lambda表达式有哪些优势:
练习一:无参无返回值
//接口
package com.csf;
public interface Eatable {
public void eat();
}
public class EatableDemp {
public static void useEatable(Eatable e){
e.eat();
}
public static void main(String[] args) {
// 匿名内部类
useEatable(new Eatable() {
@Override
public void eat() {
System.out.println("白嫖真爽");
}
});
// lambda表达式
useEatable(()->System.out.println("白嫖真爽"));
}
}
com.csf.EatableDemp
白嫖真爽
白嫖真爽
Process finished with exit code 0
由上面的方法可以看到匿名内部类和lambda表达式之间的区别。
练习二:有一个形参,无返回值
//接口
package com.csf;
public interface Flyable {
public void fly(String s);
}
public class FlyableDemo {
public static void useFlyable(Flyable f){
f.fly("张三李四王二麻");
}
public static void main(String[] args){
// 匿名内部类
useFlyable(new Flyable() {
@Override
public void fly(String s) {
System.out.println(s);
System.out.println("马资格");
}
});
// lambda
useFlyable(s->System.out.println(s));
}
}
张三李四王二麻
马资格
张三李四王二麻
Process finished with exit code 0
练习三:有多个参数,有返回值
//接口
package com.csf;
public interface Addable {
int add(int x,int y);
}
public class AddableDemo {
public static void useAddable(Addable addable){
addable.add(10,20);
}
public static void main(String[] args) {
useAddable((x,y)->{
System.out.println(x+y);
return x+y;
});
}
}
30
Process finished with exit code 0
可以知道lambda和匿名内部类有下面几个区别:
所属类型不同:
匿名内部类:可以是接口,抽象类和具体类
lambda表达式:只能是接口
使用的限制不同:
如果接口中有且仅有一个抽象方法,可以使用lambda表达式,也可以使用匿名内部类
如果接口中不止一个抽象方法,只能使用匿名内部类
实现的原理不同
匿名内部类在编译之后,产生一个单独的.class文件,而lambda则没有,对应的字节码会在运行的时候动态生成
学习整理!