Lambda表达式
什么是Lambda表达式
Lambda表达式时Java8中提供的一种新的特性,一种匿名函数方法,可以把Lambda表达式理解为一段可以传递的代码,可以写出更简洁、更灵活的代码
为什么要是有Lambda表达式
- 避免匿名内部类定义过多
- 可以让你的代码看起来更简洁
- 去掉一堆没有意义的代码,只留下核心逻辑
函数式接口
理解Funcyional InterFace(函数式接口)是学习Java8 Lambda表达式的关键所在
-
函数式接口的定义:
-
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
public interface Runnable{
public abstract void run();
}
-
对于函数式接口,我们可以通过Lambda表达式创建该接口的对象
-
Lambda语法格式
Lambda表达式就是对函数式接口中抽象方法的实现,是对其匿名内部类的一个简写,只保留了 方法的参数列表和方法体,其他的成分可以省略。因此,Lambda表达式的格式非常简洁,只有三部分组成:
-
参数列表
-
箭头
-
方法体
总结:(参数列表)->{方法体}
代码样式
package Lambda;
public class TestLambda {
// 3.静态内部类
static class Love2 implements Like{
@Override
public void lambda() {
System.out.println("I Love Lambda2");
}
}
public static void main(String[] args) {
Like like = new love();
like.lambda();
like = new Love2();
like.lambda();
// 4.局部内部类
class Love3 implements Like{
@Override
public void lambda() {
System.out.println("I Love Lambda3");
}
}
like = new Love3();
like.lambda();
// 5.匿名内部类
like = new Like(){
@Override
public void lambda() {
System.out.println("I Love Lambda4");
}
};
like.lambda();
// 6.用Lambda简化
like =() ->{
System.out.println("I Love Lambda5");
};
like.lambda();
}
}
//1.定义一个函数式接口
interface Like{
void lambda();
}
//2.实现类
class love implements Like{
@Override
public void lambda() {
System.out.println("I Love Lambda");
}
}
1~6是逐步简化代码的过程
代码运行结果:
I Love Lambda
I Love Lambda2
I Love Lambda3
I Love Lambda4
I Love Lambda5
Lambda表达式:省略模式
在Lambda标准格式的基础商,使用省略写法的规则为:
- 小括号内参数的参数类型可以省略
- 小括号有且只有一个参数,则小括号可以直接省略
- 如果花括号有且只有一个语句,无论是否有返回值,花括号、return关键字,分号可以省略
Lambda省略模式代码实现
package Lambda;
public class TestLambda02 {
public static void main(String[] args) {
Ilove love =(int a)->{
System.out.println("我爱你"+a+"遍");
};
love.love(3000);
// 1.简化1:去掉参数类型
love =(int a)->{
System.out.println("我爱你"+a+"遍");
};
love.love(6000);
// 简化2:简化括号
love = a->{
System.out.println("我爱你"+a+"遍");
};
love.love(9000);
// 简化3:去掉花括号
love = a -> System.out.println("我爱你"+a+"遍");
love.love(12000);
}
}
interface Ilove{
void love(int a);
}
代码运行结果:
我爱你3000遍
我爱你6000遍
我爱你9000遍
我爱你12000遍
总结
- Lambda表达式只能有一行代码的情况下才能简化为一行代码。如果有多行代码,那么只能用代码块包裹
- 前提是接口为函数式接口
- 多个参数也可以去掉参数类型,但要去就得全部去掉,必须加上括号