Lambda表达式
λ希腊字母表中排序第十一位的字母,英语名称为:Lambda
作用:
- 避免内部类定义过多
- 可以让代码看起来简洁
- 去掉一些没有意义的代码,只留下核心代码
函数式接口:本质上就是一个接口,但是接口内部只有一个抽象方法,这种借口就叫做函数式接口。
下面演示lambda表达式的演变↓↓↓↓↓↓↓
//以前我们调用一个接口实现类中的方法的过程是这样的
//三个文件,一个接口文件,一个实现类文件,一个主程序文件
public interface SelfIntroduction{
void speak(String name);
}
public class Person implements SelfIntroduction{
@Override
public void speak(String name) {
System.out.println("我的名字叫作:"+name);
}
}
public class Application {
public static void main(String[] args) {
Person person = new Person();
person.speak("张三");
}
}
/*
我们发现,三个文件会占用较多资源,便有了简化方式,将实现类放在主程序文件中,变成静态内部类
*/
//两个文件,一个接口文件,一个主程序文件
public interface SelfIntroduction{
void speak(String name);
}
public class Application {
static class Person implements SelfIntroduction{ //静态内部类
@Override
public void speak(String name) {
System.out.println("我的名字叫作:"+name);
}
}
public static void main(String[] args) {
Person person = new Person();
person.speak("张三");
}
}
/*
将实现类文件变为静态内部类后,代码还是不美观,再将其变成成员内部类
*/
//两个文件,一个接口文件,一个主程序文件
public interface SelfIntroduction{
void speak(String name);
}
public class Application {
public static void main(String[] args) {
class Person implements SelfIntroduction{ //成员内部类
@Override
public void speak(String name) {
System.out.println("我的名字叫作:"+name);
}
}
Person person = new Person();
person.speak("张三");
}
}
/*
将实现类文件变为主程序文件的成员内部类后,代码依旧不美观,再将其变为匿名内部类
*/
//两个文件,一个接口文件,一个主程序文件
public interface SelfIntroduction{
void speak(String name);
}
public class Application {
public static void main(String[] args) {
//此时这里变为new了一个接口文件,变为匿名内部类
SelfIntroduction person = new SelfIntroduction() {
@Override
public void speak(String name) {
System.out.println("我的名字叫作:"+name);
}
};
person.speak("张三");
}
}
/*
此时文件开始变得有些难以理解了,干脆从JDK1.8开始引入Lambda表达式,从而进一步简化
*/
//两个文件,一个接口文件,一个主程序文件
public interface SelfIntroduction{
void speak(String name);
}
public class Application {
public static void main(String[] args) {
SelfIntroduction person = null;
person = (String name) -> {
System.out.println("我的名字叫作:"+name);
};
person.speak("张三");
}
}
/*
Lambda表达式已经简化了特别多的代码了,但是还可以进一步简化
这里我们仅仅展示简化代码段,其他的依旧保持不变
*/
//简化1:省略数据类型
person = (name) -> {
System.out.println("我的名字叫作:"+name);
};
//简化2:省略参数列表的括号
person = name -> {
System.out.println("我的名字叫作:"+name);
};
//简化3:省略大括号。慎用!!当方法体仅有一行代码时可用
person = name -> System.out.println("我的名字叫作:"+name);
Lambda总结:
- lambda表达式只有一行代码才能简化为一行,如果有多行,那么就用代码块包裹
- lambda表达式的使用前提为接口必须为函数式接口,即接口内部只有一个抽象方法。
- 多个参数也可以去掉参数类型,要去掉就一起都去掉,但是必须加上括号