Lambda
表达式是JDK1.8推出的重要新特性。
函数式编程和面向对象编程可以理解为两大开发阵营。但是很多人认为传统的面向对象开发结构过于完整,代码量大,所以才诞生了函数式编程这种新的开发方法。
我们先来看看传统面向对象开发方法:
package www.testdemo.lambda;
interface IMessage {
void print();
}
public class TestLambda {
public static void main(String[] args) {
//匿名内部类
IMessage m = new IMessage() {
@Override
public void print() {
System.out.println("IMessage的实现类");
}
};
m.print();
}
}
接口IMessage
中的抽象方法必须由子类来覆写;要先创建对象,通过构造方法实例化对象再调用普通方法等等,必须按照完整语法来编写。这就是传统面向对象开发的局限性。
如果采用函数式编程,则代码可以简化成如下形式:
package www.testdemo.lambda;
interface IMessage {
void print();
}
public class TestLambda {
public static void main(String[] args) {
//函数式编程
IMessage m = () -> System.out.println("IMessage的实现类");
m.print();
}
}
- 要想使用函数式编程有一个前提:
接口必须只有一个方法,如果有两个方法,则无法使用函数式编程。如果现在某个接口就是为了函数式编程而生的,最好在定义时就让其只能够定义一个方法,所以就有了函数式接口:
① 函数接口为函数式编程而生。
② 只能定义一个抽象方法。
③ 为了防止函数接口中定义多余一个的抽象方法,导致函数接口变成普通接口,在接口定义时使用@FunctionalInterface
注解。
④ 使用lambda
表达式进行编程。
⑤ lambda
方法体:
(参数名列表) -> {
code1
code2
[return]
}
如果方法体本身只包含一行语句,直接写单行语句即可;如果有多行语句,就需要使用{}
如果方法体中只有一条语句并且作为返回值,可以省略return
如果方法体中访问外部变量,隐式外部变量final修饰,和内部类相同
列表中的参数名称不要跟外部代码中的变量名重名
建议编写完整格式!
package www.testdemo.lambda;
@FunctionalInterface
interface IAdd {
int add(int a, int b);
}
@FunctionalInterface
interface IMessage {
void print();
}
public class TestLambda {
public static void main(String[] args) {
//方法体只有一行语句且作为返回值,所以不需要{}和return
IAdd iAddObject = (a, b) -> a+b;
System.out.println(iAddObject.add(1, 2));
System.out.println(iAddObject.add(3, 5));
//方法体只有一行语句可以省略{}
IMessage m1 = () -> System.out.println("Hello world");
m1.print();
//方法体有多行语句的时候不能省略{}
IMessage m2 = () -> {
System.out.println("111");
System.out.println("222");
System.out.println("333");
};
m2.print();
}
}