lambda表达式
什么是lambda表达式?
Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)
lambda表达式作用
优化代码,减少冗余。提升程序健壮性,解放双手,减少患关节炎的概率。
开胃菜
假设我们开辟一个线程,传统写法要写好多行代码,而lambda只需要一行。
传统写法
@Test
public void traditionalTest() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}, "传统写法").start();
}
lambda写法
@Test
public void lambdaTest() {
new Thread(() -> System.out.println(Thread.currentThread().getName()), "Hello,lambda!").start();
}
开始学习lambda
学习lambda之前,需要先知道什么是匿名内部类。众所周知在java里是不能直接对接口进行new的。如果我们想这样操作那必须有一个类去实现这个接口,但是不是所有的类我们都要用。如果我们只希望这个类出现一次那么我们可以考虑使用匿名内部类。
Anonymous classes enable you to make your code more concise. They enable you to declare and instantiate a class at the same time. They are like local classes except that they do not have a name. Use them if you need to use a local class only once.
示例代码
new Thread(new Runnable() {
@Override
public void run() {
}
});
匿名内部类的使用方法很简单,new InterfaceName() 然后实现接口的方法即可。
lambda表达式要求
- 依赖函数接口
- Interface里只能允许一个抽象方法
- 可以使用@FunctionalInterface标注
@FunctionalInterface
public interface Executable {
void exec();
}
从匿名内部类到lambda表达式
1. 匿名内部类的写法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("doSomething");
}
}).start();
2. 只保留方法参数
和方法体
&&参数和方法体之间加上->
new Thread(()->{
System.out.println("doSomething");
}).start();
3. 如果只有一行代码可以去掉 {}
new Thread(()->System.out.println("doSomething")).start();
三种lambda表达式使用方法
- 传统写法
@FunctionalInterface
public interface Executable {
void exec();
}
public class Executor {
public static void run(Executable e) {
e.exec();
}
public static void main(String[] args) {
run(() -> {
System.out.println("Hello,World!");
});
}
}
- lambda表达式赋值给接口
public class Executor {
public static void run(Executable e) {
e.exec();
}
public static void main(String[] args) {
Executable executable = ()->{
System.out.println("Hello,World!");
};
executable.exec();
}
}
- 强制类型转换
public class Executor {
public static void run(Executable e) {
e.exec();
}
public static void main(String[] args) {
((Executable)()->{ System.out.println("Hello,World"); }).exec();
}
}