三、lambda入门
之前的文章@FunctionalInterface的使用说明已经介绍了函数式接口,现在我们来了解下JDK8大名鼎鼎的lambda。
Runnable traditionalRunnable = new Runnable() {
@Override
public void run() {
System.out.println("traditionalRunnable");
}
};
traditionalRunnable.run();
Runnable lambdaRunnable = () -> System.out.println("lambdaRunnable");
lambdaRunnable.run();
traditionalRunnable是我们传统的做法,lambdaRunnable是使用了lambda表达式。两种创建Runnable对象的方法,可以明显看出lambda更加简洁。
个人感觉
lambda其实就是为@FunctionalInterface服务的,能够用一种全新的、简洁的语法创建函数式接口的对象。当然如果一个接口不符合函数式接口的定义,是不能通过lambda表达式来创建其对象的。lambda其实就是定义入参、函数体、返回值,然后可以生成任意一个接口(符合该函数入参和返回值的函数式接口)的对象。
lambda表达式的一般语法
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
//.............
return statmentM;
}
只要一个接口(必须是函数式接口)中的抽象方法,符合lambda表达式的定义,那么就可以通过lambda表达式创建其对象。比如下面的DogInterface和CatInterface都是一个函数式接口:
@FunctionalInterface
public interface CatInterface {
void sayHello();
}
@FunctionalInterface
public interface DogInterface {
void sayWelcome();
}
虽然接口中的方法名不同,但是方法的入参和返回值都是一样的,所以我们就可以使用相同的lambda表达式创建对象。
CatInterface cat = () -> {System.out.println("cat");}
DogInterface dog = () -> {System.out.println("dog");}
cat.sayHello();
dog.sayWelcome();
lambda表达式常见的简化写法
- 入参的类型是可以省略的(当然加上也没有问题),因为可以从上下文环境中推断出lambda表达式的参数类型。
@FunctionalInterface
public interface TwoArgsInterface {
void add(int left, int right);
}
TwoArgsInterface twoArgs1 = (int a, int b) -> System.out.println("no argument");
// 省略参数类型
TwoArgsInterface twoArgs2 = (a, b) -> System.out.println("no argument");
- 没有入参的时候,比如上面的Runnable接口,直接用()代表无参数。
Runnable lambdaRunnable = () -> {System.out.println("lambdaRunnable");};
- 当lambda表达式的参数个数只有一个,可以省略小括号。
// 完整语法
OneArgsInterface oneArgs1 = (int a) -> System.out.println("arguments=" + a);
// 省略参数类型
OneArgsInterface oneArgs2 = (a) -> System.out.println("arguments=" + a);
// 最简洁的写法(省略类型和括号)
OneArgsInterface oneArgs3 = a -> System.out.println("arguments=" + a);
- 当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。
// 完整写法
Runnable runnable1 = () -> { System.out.println("lambdaRunnable"); };
// 省略大括号和结尾的分号
Runnable runnable2 = () -> System.out.println("lambdaRunnable");
@FunctionalInterface
public interface DemoInterface {
double add(double right);
}
// 完整写法
DemoInterface way1 = a -> { return a * 10; };
// 省略return和大括号
DemoInterface way2 = a -> a * 10;