Java8新特性——Lambda表达式
1 Lambda表达式简介
- λ是希腊字母表中的第11个字母,英文名叫Lambda
- Lambda表达式的出现是为了避免匿名内部类定义过多
- 其实质是函数式编程
2 Lambda表达式作用
- 避免匿名内部类定义过多
- 简化代码
- 去掉无意义代码,留下核心逻辑
3 函数式接口的定义
理解Functional interface(函数式接口)是学习Java8 Lambda表达式的关键所在。
-
任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。示例如下
public interface Runnable{ public abstract void run(); }
-
对于函数式接口,我们可以通过Lambda表达式来创建该接口对象
4 接口实现方式的演化
接口的实现有很多方式,以下从上到下逐步简化,到Lambda表达式,简化到只需2行代码。
/**
* 推导Lambda表达式
*/
//1.定义一个函数式接口
interface ILike{
void lambda();
}
//2.实现类
class Like implements ILike {
@Override
public void lambda() {
System.out.println("I like lambda. --> 1");
}
}
public class TestLambda1 {
//3.静态内部类简化接口的实现
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println("I like lambda. --> 2");
}
}
public static void main(String[] args) {
ILike like = new Like();
like.lambda();
like = new Like2();
like.lambda();
//4.局部内部类简化接口的实现
class Like3 implements ILike {
@Override
public void lambda() {
System.out.println("I like lambda. --> 3");
}
}
like = new Like3();
like.lambda();
//5.匿名内部类简化接口的实现
like = new ILike() {
@Override
public void lambda() {
System.out.println("I like lambda. --> 4");
}
};
like.lambda();
//6.Lambda表达式简化接口的实现
like = () -> System.out.println("I like lambda. --> 5");
like.lambda();
}
}
5 Lambda表达式的用法
这个就通过一段代码来演示
/**
* 带参数的接口
*/
public class TestLambda2 {
public static void main(String[] args) {
ILove love = (name) -> {
System.out.println("I love " + name);
};
//简化括号(仅适用于单个参数)
love = name -> {
System.out.println("I love " + name);
};
//简化大括号(仅适用于单个方法或表达式)
love = name -> System.out.println("I love " + name);
//调用
love.showLove("Lucy");
//多个参数(若有返回值类型,可做表达式计算)
ILove2 love2 = (from,to) -> System.out.println(from + " love " + to);
love2.showLove("Lucy","Jack");
//表达式计算(要求函数式接口有返回值类型)
ILove3 love3 = (from,to) -> from + to;
System.out.println(love3.showLove("Lucy","Jack"));
}
}
interface ILove{
void showLove(String name);
}
interface ILove2 {
void showLove(String from,String to);
}
interface ILove3 {
String showLove(String from,String to);
}
总结:
- Lambda表达式使用的前提是:接口为函数式接口(接口内只有一个方法)
- Lambda表达式语法:
(param1,param2,...) -> {Statement1;Statement2;...}
()
内为接口中方法的参数(可带上声明的参数类型),按顺序传参。{}
中为需要执行的语句、方法或表达式。- 若接口中方法只有一个参数,则
()
可省略,否则不能省略- 若
{}
中只有一条语句、方法或表达式,则{}
可省略,否则不可省略- 接口中方法有返回值时,才可直接写表达式。