之前的文章@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();
}
CatInterface cat = () -> {System.out.println("cat");}
DogInterface dog = () -> {System.out.println("dog");}
cat.sayHello();
dog.sayWelcome();
lambda表达式有各种简化版本,现在我们就学习下一下常见的简化写法。
1、入参的类型是可以省略的(当然加上也没有问题),因为可以从上下文环境中推断出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");
2、没有入参的时候,比如上面的Runnable接口,直接用()代表无参数。
Runnable lambdaRunnable = () -> {System.out.println("lambdaRunnable");};
3、当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);
// 完整写法
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;