此文章介绍lambda表达式的由来,如何变化的。让大家更容易理解。其他介绍lambda的文章,只介绍了语法,不知道为何这样写。结合函数式编程。一起讲解。
lambda表达式是由匿名类(匿名函数)演化而来。以前写匿名函数,代码太多,比较复杂,其实也是一段代码。改用lambda表达式后,简洁清晰。
必须是jdk8以上才可以。
目录
lambda演化过程
无参演化过程
先写一个接口,内部只能有一个方法,方法多了,就不能用lambda转化了。idea也有提示功能,提示匿名函数转化为lambda。
public interface UserService {
String getName();
}
在写一个测试方法
public static void main(String[] args) {
String name = addName(
// 匿名函数代码
new UserService() {
@Override
public String getName() {
return "lisi";
}
}
);
//输出lisi====haole
System.out.println(name);
}
private static String addName(UserService userService) {
return userService.getName()+"====haole";
}
idea中,将鼠标放在代码上有提示
鼠标点一下结果如图
lambda图1
到这里大家就看到了lambda的模型了。
解释:
lambda语法形式为 () -> {},其中 () 用来描述参数列表,{} 用来描述方法体,-> 为 lambda运算符 ,读作(goes to)。
上图--lambda图1,是最简洁的表现形式,只不过逻辑代码只有一行就省掉了{},和return;用完全的语法写是这样的。
lambda图 2
如果代码比较复杂,就不能省略了,比如:
总结:所有lambda表达式的写法都会有一个函数接口。更多的lambda语法:
// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的差值 (x, y) -> x – y // 4. 接收2个int型整数,返回他们的和 (int x, int y) -> x + y // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) (String s) -> System.out.print(s)
有参演化过程
函数接口
public interface UserService {
String getName(int age);
}
调用实现
public static void main(String[] args) {
String name = addName(8,
// 匿名函数
new UserService() {
@Override
public String getName(int age) {
return "lisi--" + age + "year";
}
});
System.out.println(name);
}
private static String addName(int age, UserService userService) {
return userService.getName(age) + "====haole";
}
lambda写法实现
public static void main(String[] args) {
String name = addName(8,
// 匿名函数 int 可以省略 return可以省略。复杂代码不可以
(int age) -> {
return "lisi--" + age + "year";
}
);
System.out.println(name);
}
private static String addName(int age, UserService userService) {
return userService.getName(age) + "====haole";
}
int省略,是因为函数接口就一个方法,所以程序可以自动推断,参数的类型及返回值。
函数式编程
jdk8新增了很多函数式接口;在java.util.function包下可以看这些接口类。他们类上都有一个注解:
@FunctionalInterface;该注解限制此接口只有一个public 方法,其他都是defaul修饰。如果有多个public 修饰的方法,程序就不能推断用哪一个了
自定义函数式接口的例子
@FunctionalInterface
public interface UserService {
String getName(int age);
default String getCityName() {
return "aa";
}
}