Java 中的 Lambda 表达式

143 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第6天,点击查看活动详情

Lambda 表达式简介

Java 8 引入函数式编程风格。函数式编程是一种编程范式,在函数式编程中,函数是第一类对象。

Java 平台之后,在 JVM 平台上,出现了多种编程语言,比如 ScalaKotlin,这些多范式的编程语言,受到越来越多开发者的关注和喜爱。为了适应开发者的需要,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 表达式能推断出参数 abint 类型,简化形式如下:

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 表达式了。