Lambda表达式
基本概念
理解 functional interface (函数式接口) 是学习java8 lambda表达式的关键所在
函数式接口定义:
任何接口,如果只包含唯一一个抽象方法,那么他就是一个函数式接口
public interface Runnable{ public abstract void run(); }
- 对于函数式接口,我们可以通过lambda表达式来创建该接口对象
为什么要用lambda 表达式
- 避免匿名内部类定义过多
- 可以让你的代码看起来更简洁
- 去掉了一堆没有意义的代码,只留下核心逻辑
Lambda表达式的产生 【个人理解】
public class LambdaTest {
//优化一下代码,放在类外太麻烦 于是乎放在类里面【第2步的代码优化】
//3. 静态内部类
static class LambdaImpl2 implements ILambdaInteface{
@Override
public void lambda() {
System.out.println("HELLO Lambda 静态内部类");
}
}
public static void main(String[] args) {
ILambdaInteface lambda = new LambdaImpl();//实现类
lambda.lambda();
lambda = new LambdaImpl2();//静态内部类
lambda.lambda();
//优化一下 静态内部类代码
//4. 局部内部类
class LambdaImpl3 implements ILambdaInteface{
@Override
public void lambda() {
System.out.println("HELLO Lambda 局部内部类");
}
}
lambda = new LambdaImpl3();//局部内部类
lambda.lambda();
//继续简化
//5. 匿名内部类 , 没有类的名称 必须借助接口或者父类
lambda = new ILambdaInteface(){
@Override
public void lambda() {
System.out.println("HELLO Lambda 匿名内部类");
}
};
lambda.lambda();
//继续简化
//6. 用 lambda 表达式简化
lambda = ()-> {
System.out.println("HELLO Lambda Lambda表达式");
};
lambda.lambda();
}
}
//1. 定义一个函数式接口
interface ILambdaInteface{
void lambda();
}
// 2. 定义一个实现类
class LambdaImpl implements ILambdaInteface{
@Override
public void lambda() {
System.out.println("HELLO Lambda");
}
}
注: lambda 表达式简化 其实也可以看作 匿名内部类 的简化
lambda = new ILambdaInteface(){
@Override
public void lambda***() {
System.out.println(“HELLO Lambda 匿名内部类”);***
}
};就是上面加粗斜体 这部分 只不过 缺少了 “ -> ”
带参数Lambda表达式
前提是函数式接口是带参数的
//带参数Lambda表达式
lambda = (int a)-> {
System.out.println("HELLO Lambda Lambda表达式"+ a);
};
//带参数Lambda表达式简化 去掉参数类型
lambda = (a)-> {
System.out.println("HELLO Lambda Lambda表达式"+ a);
};
//带参数Lambda表达式简化 去掉“()”
lambda = a-> {
System.out.println("HELLO Lambda Lambda表达式"+ a);
};
//带参数Lambda表达式简化 去掉“{}”
lambda = a-> System.out.println("HELLO Lambda Lambda表达式"+ a);
注:去掉“{}”的情况是里面只有一行语句,因为“;”代表一行结束。
如果是多行代码,那么就要用代码块【"{}"】包裹
多个参数也可以去掉参数类型,不过要去掉就都去掉,必须加括号