为什么使用Lambda表达式
1.避免匿名内部类定义过多
2.让代码开起来更简洁
3.让程序员只关注核心方法的逻辑实现
什么情况下可以使用Lambda表达式
1.只有函数式接口才可以使用Lambda表达式
函数式接口:有且只有一个抽象方法的接口;
例如:Java多线程中Runable就是一个函数式接口,所有继承Runable接口的类都必须实现其run()方法,这些类可以作为一个单独的线程来执行操作,例如Thread线程类就是继承自Runable接口。
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
我们在创建一个线程的时侯就可以使用lambda表达式,我们知道如果可以给Thread传入一个实现Runable接口的实现类来创建一个线程。
所以我们可以用lambda表达式这样写代码:
new Thread(()->{System.out.println("重写run方法")});
2.Lambda表达式的代码格式
(param)->{ 方法 }
param为函数式接口内抽象方法的参数,参数可以省略参数类型,原则是如果有多个参数,要省则都省略。方法体中如果只有一句也可以不需要花括号{} , 它会返回一个实现了函数式接口方法的实例对象。
Lambda表达式使用示例
本示例使用了五种方法实现:外部类、静态内部类、局部内部类、匿名内部类、Lambda表达式实现结果是一样的,但是lambda表达的三点优势很容易在这个例子中得以体现。
public class TestLambda{
//方法二 定义一个静态内部类
static class myLuck2 implements Luck{
@Override
void lambda(int num){
System.out.println("我的幸运数字是"+num)
}
}
public static void main(String[] args){
//方法一 使用外部定义的类 输出 我的幸运数字是1
Luck luck1 = new myLuck1();
luck1.lambda(1);
//方法二 使用内部静态定义的类 输出 我的幸运数字是2
Luck luck2 = new myLuck2();
luck2.lambda(2);
//定义局部内部类
class myLuck3 implements Luck{
@Override
void lambda(int num){
System.out.println("我的幸运数字是"+num)
}
}
//方法三 使用局部内部类 输出 我的幸运数字是3
Luck luck3 = new myLuck3();
luck2.lambda(3);
//方法四 使用匿名内部类,类没有名称,必须借助接口或者父类来创建
Luck luck4 = new Luck(){
@Override
void lambda(int num){
System.out.println("我的幸运数字是"+num)
}
}
//输出 我的幸运数字是4
luck4.lambda(4);
//方法五 使用lambda表达式 输出 我的幸运数字是5
//该方法只有一句代码和一个参数 所以可以进一步简化为 num->System.out.println("我的幸运数字是"+num);
Luck luck5 = (num)->{System.out.println("我的幸运数字是"+num);}
luck5.lambda(5)
}
}
//定义一个函数式接口
interface Luck{
void lambda(int num);
}
//方法一 实现函数式接口
class myLuck1 implements Luck{
@Override
void lambda(int num){
System.out.println("我的幸运数字是"+num)
}
}