一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情。
Lambda 表达式简介
Java 8
引入函数式编程风格。函数式编程是一种编程范式,在函数式编程中,函数是第一类对象。
在 Java
平台之后,在 JVM
平台上,出现了多种编程语言,比如 Scala
和 Kotlin
,这些多范式的编程语言,受到越来越多开发者的关注和喜爱。为了适应开发者的需要,Java 8
引入了函数式编程。
Lambda
表达式本质上实现了将行为参数化传递,即将方法作为入参传递。
Lambda
表达式可以使用简洁的语法来创建函数式接口实现类的实例,避免了匿名内部类的繁琐。
Lambda 表达式的各种形式
(parameters) -> expression
(parameters) -> { statement; }
特征:
- 可选的类型声明,可以不需要声明参数类型,编译器统一识别参数值
- 可选的参数圆括号,一个参数无需加圆括号,多个参数才需要加
- 可选的花括号,如果主体仅包含一个表达式,无需花括号
- 可选的
return
返回关键字,如果主体只有一个表达式,会自动将它的值返回
形式一:没有参数(小括号不能省略)
() -> System.out.println("hello world");
形式二:只有一个参数
name -> System.out.println("hello world" + name);
形式三:没有参数,但是逻辑复杂
() -> {
System.out.println("hello");
System.out.println("world");
}
形式四:包含两个参数的方法
BinaryOperator<Long> functionAdd = (x, y) -> x + y;
Long result = functionAdd.apply(1L, 2L);
形式五:对参数显示声明
BinaryOperator<Long> functionAdd = (Long x, Long y) -> x + y;
Long result = functionAdd.apply(1L, 2L);
Lambda 表达式的简写法
省略参数类型
Lambda
表达式可以根据上下文环境推断出参数类型。calculate
方法中 Lambda
表达式能推断出参数 a
和 b
是 int
类型,简化形式如下:
public static Calculable calculate(char opr) {
Calculable result;
if (opr == '+') {
// Lambda表达式实现Calculable接口
result = (a, b) -> {
return a + b;
};
} else {
// Lambda表达式实现Calculable接口
result = (a, b) -> {
return a - b;
};
}
return result;
}
省略参数小括号
如果 Lambda
表达式中的参数只有一个,可以省略参数小括号。修改 Calculable
接口中的 calculateInt
方法,代码如下。
// 可计算接口
@FunctionalInterface
public interface Calculable {
// 计算一个int数值
int calculateInt(int a);
}
其中 calculateInt
方法只有一个 int
类型参数,返回值也是 int
类型。调用 calculateInt
方法代码如下:
public static void main(String[] args) {
int n1 = 10;
// 实现二次方计算Calculable对象
Calculable f1 = calculate(2);
// 实现三次方计算Calculable对象
Calculable f2 = calculate(3);
// 调用calculateInt方法进行加法计算
System.out.printf("%d二次方 = %d \n", n1, f1.calculateInt(n1));
// 调用calculateInt方法进行减法计算
System.out.printf("%d三次方 = %d \n", n1, f2.calculateInt(n1));
}
/**
* 通过幂计算
*
* @param power 幂
* @return 实现Calculable接口对象
*/
public static Calculable calculate(int power) {
Calculable result;
if (power == 2) {
// Lambda表达式实现Calculable接口
// 标准形式
result = (int a) -> {
return a * a;
};
} else {
// Lambda表达式实现Calculable接口
// 省略形式
result = a -> {
return a * a * a;
};
}
return result;
}
省略 return 和大括号
如果 Lambda
表达式体中只有一条语句,那么可以省略 return
和大括号,代码如下:
public static Calculable calculate(int power) {
Calculable result;
if (power == 2) {
// Lambda表达式实现Calculable接口
// 标准形式
result = (int a) -> {
return a * a;
};
} else {
// Lambda表达式实现Calculable接口
// 省略形式
result = a -> a * a * a;
}
return result;
}
省略了 return
和大括号,这是最简化形式的 Lambda
表达式了。