JDK8新特性:lambda入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aitangyong/article/details/54317539

之前的文章@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);

扫描二维码关注公众号,回复: 2955609 查看本文章


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;



猜你喜欢

转载自blog.csdn.net/aitangyong/article/details/54317539