Lambda表达式
1.为什么使用lambda:
避免匿名内部类定义过多,可以让代码更简洁,去掉一堆没有意义的代码,只留下核心的逻辑,实质属于函数式编程的概念。要理解lambda表达式前必须了解函数式接口。
2.函数式接口:
函数式接口(Functional Interface)指的是只包含唯一一个抽象方法的接口,比如熟悉的Runnable接口
public interface Runnable{
public abstract void run();
}
对于函数式接口,都可以通过lambda表达式来创建该接口的对象。
3.lambda的推导
从原始的实现类到内部类,再到使用lambda的过程,一步步简化代码
// 1.定义一个函数式接口
interface ILike{
void lambda();
}
// 2.实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println("I like lambda");
}
}
public class TestLambda {
// 3.静态内部类
static class Like1 implements ILike{
@Override
public void lambda() {
System.out.println("I like lambda1");
}
}
public static void main(String[] args) {
ILike like;
like = new Like();
like.lambda();
like = new Like1();
like.lambda();
// 4.局部内部类
class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("I like lambda2");
}
}
like = new Like2();
like.lambda();
// 5.匿名类,没有类的名称,必须借助接口或者父类
like = new ILike() {
@Override
public void lambda() {
System.out.println("I like lambda3");
}
};
like.lambda();
// 6.使用lambda
like = ()->{
System.out.println("I like lambda4");
};
like.lambda();
}
}
4.lambda的简化
带参的lambda表达式简化:
public class TestLambda2 {
public static void main(String[] args) {
IWork iWork;
String me = "我";
iWork = (String str)->{
System.out.println(str + "正在工作!");
};
iWork.work(me);
// 去掉参数类型,括号,花括号
String you = "你";
iWork = str -> System.out.println(str + "正在工作!");
iWork.work(you);
}
}
interface IWork{
void work(String str);
}
总结:
- lambda表达式只有一行代码时,可以把花括号去掉。
- 当只有一个参数时,可以把方法括号去掉。多个参数时,要用括号!
- 可以把参数的类型去掉。