您的位置:首页 > 编程语言 > Java开发

JDK8新特性:lambda入门

2017-01-11 09:26 232 查看
之前的文章@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表达式有各种简化版本,现在我们就学习下一下常见的简化写法。

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);


4、当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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息