在jdk8中,为了简化代码,减少不必要的代码,推出了Lambda表达式
变化过程演示
- 定义函数式接口
函数式接口:只有一个方法的接口,成为函数式接口。
只有函数式接口,才可以用Lambda实现
interface ILike{
public void print();
}- 实现类
首先按照最原始的写法,实现接口
class Like implements ILike{
@Override
public void print() {
System.out.println("I Like lambda.");
}
}在Main方法中运行
public static void main(String[] args){
ILike like = new Like();
like.print();
}- 静态内部类
有时候定义的类只会在一个类中使用,新建一个类会显得比较麻烦。于是可以将类放在类内部,便可以定义成静态内部类。
static class Like2 implements ILike{
@Override
public void print() {
System.out.println("I Like lambda2.");
}
}在Main方法中运行
public static void main(String[] args){
ILike like = new Like2();
like.print();
}- 局部内部类
有时候定义的类只会被使用一次,若全部都写成静态内部类,则会看起来比较凌乱、臃肿,代码不够优雅。于是便可以将类定义成局部内部类,卸载main方法或其他方法中
public static void main(String[] args) {
//4. 局部内部类
class Like3 implements ILike{
@Override
public void print() {
System.out.println("I Like lambda3");
}
}
ILike like = new Like3();
like.print();
}- 匿名内部类
相对与局部内部类可以做进一步的简化,写成匿名内部类。省略了class与类名,直接new 接口
public static void main(String[] args) {
//5. 匿名内部类
ILike like = new ILike() {
@Override
public void print() {
System.out.println("I like lambda4,");
}
};
like.print();
}- Lambda表达式
在JDK8中,为了进一步简化,提供了lambda表达式进行简化。去掉了重复的内容,只保留了参数和方法体。
public static void main(String[] args) {
//6. Lambda表达式
ILike like = () -> {
System.out.println("I like lambda5.");
};
like.print();
}注意:Lambda表达式只保留了参数和方法体,而为了简化,方法体并未指明实现的是哪一个方法,所以Lambda表达式只能实现
函数式接口。
带参数写法
定义函数式接口
interface ILove{
void love(int a);
}- 用Lambda简化
public static void main(String[] args){
ILove love = (int a) -> {
System.out.println(a);
//love = System.out::println;
}
love.love(3);
}- 简化参数类型
public static void main(String[] args){
ILove love = (a) -> {
System.out.println(a);
}
love.love(4);
}注意:多个参数也可以去掉参数类型,要去掉的话必须都去掉
- 简化括号
public static void main(String[] args){
ILove love = a -> {
System.out.println(a);
}
love.love(5);
}注意:多个参数不可以去掉
- 简化花括号
public static void main(String[] args){
ILove love = a -> System.out.println(a);
love.love(6);
}注意:花括号只有在方法体只有一条语句(比如这里的
System.out.println(a);)时才可以被简化,当方法体中有多个语句时不可以被简化。