Lambda表达式
在之前的多线程学习中我们使用到了lambda表达式来简化代码,现在我们来具体讲一讲它的用法。(我们以往都是通过创建 Thread 对象,然后通过匿名内部类重写 run() 方法,一提到匿名内部类我们就应该想到可以使用 lambda 表达式来简化线程的创建过程。)
Lambda简介
Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。
对接口的要求:虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。(jdk 8 中有另一个新特性:default, 被 default 修饰的方法会有默认实现,不是必须被实现的方法,所以不影响 Lambda 表达式的使用。)
@FunctionalInterface
修饰函数式接口的,要求接口中的抽象方法只有一个。 这个注解往往会和 lambda 表达式一起出现。
语法形式
为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符 ,读作(goes to)。
下面这段代码可以跟着序号逐步观察推导过程,代码的简化(工资按代码量计算真的不合理)
定义一个接口,定义实现类实现接口、静态内部类实现接口、局部内部类实现接口、匿名内部类实现接口、Lambda表达式实现接口,这些方法一步步让代码变简单。
package TreadTest.Lambda;
/*
推导lambda表达式
*/
public class TestLambda {
//3.静态内部类
static class Like2 implements ILike
{
@Override
public void lambda() {
System.out.println("i like lambda2");
}
}
public static void main(String[] args) {
ILike iLike = new Like();
iLike.lambda();
iLike = new Like2();
iLike.lambda();
//4.局部内部类
class Like3 implements ILike
{
@Override
public void lambda() {
System.out.println("i like lambda3");
}
}
iLike = new Like3();
iLike.lambda();
//5.匿名内部类
iLike = new ILike() {
@Override
public void lambda() {
System.out.println("i like lambda4");
}
};
iLike.lambda();
//6.lambda简化
iLike = ()->{
System.out.println("i like lambda5");
};
iLike.lambda();
}
}
//1。定义一个接口
interface ILike{
void lambda();
}
//2.实现类
class Like implements ILike
{
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
下面这段代码展示了Lambda表达式的进一步简化规则
package TreadTest.Lambda;
public class TestLambda2 {
public static void main(String[] args) {
//1.lambda表示简化
ILove love = (int a)->{
System.out.println("I love lambda"+a);
};
//简化1.参数类型
love = (a)->{
System.out.println("I love lambda"+a);
};
//简化2.简化括号
love = a->{
System.out.println("I love lambda"+a);
};
//简化3.去掉花括号(只有一行代码时才能简化)
love = a-> System.out.println("I love lambda"+a);
love.lambda(520);
//总结:
// 1.接口是函数式接口,接口里面只有一个方法(runnable接口符合这一点)
// 2.多个参数也可以去掉参数类型,但要去掉就全去掉,必须加括号
}
}
//1。定义一个接口
interface ILove{
void lambda(int a);
}
lambda表达式是代替匿名类简化代码的神器,它也有跟多功能值得我们了解比如引用方法、引用构造方法、在Stream流式编程中的用法等等。下面这篇博客有兴趣可以看看。
学习参考:
https://www.cnblogs.com/haixiang/p/11029639.html
这篇博客讲的更多更详细,值得学习