Java - Lambda 表达式
Java Lambda 表达式
Lambda 表达式 在 Java 8 中引入,被誉为 Java 8 的最大特性。Lambda 表达式促进了函数式编程,并大大简化了开发工作。Lambda 表达式基于函数式接口的原则工作。函数式接口是一个只有一个方法需要实现接口。Lambda 表达式为函数式接口的方法提供了实现。
Lambda 表达式 大大简化了函数式编程,使代码更易读,且无需任何样板代码。Lambda 表达式可以推断参数的类型,并且无需 return 关键字即可返回值。对于只有一个语句的简单方法,甚至可以省略大括号。
Lambda 表达式语法
Lambda 表达式的语法如下所示。
parameter -> expression body
Java Lambda 表达式的特性
以下是 Lambda 表达式的关键特性。
可选的类型声明 − 无需声明参数的类型。编译器可以从参数的值中推断类型。
参数周围的可选括号 − 无需为单个参数使用括号。对于多个参数,需要使用括号。
可选的大括号 − 如果表达式体只包含一个语句,则无需使用大括号。
可选的 return 关键字 − 如果表达式体只有一个需要返回值的表达式,编译器会自动返回该值。要表示表达式返回值的,必须使用大括号。
Java Lambda 表达式示例
在这个示例中,我们有一个函数式接口 MathOperation,它包含一个 operate 方法,该方法可以接受两个 int 参数,执行运算并将结果作为 int 返回。使用 lambda 表达式,我们为 MathOperation 的 operate 方法创建了四种不同的实现,用于对两个整数进行加法、减法、乘法和除法运算,并获取相应的结果。然后我们还有另一个函数式接口 GreetingService,它包含一个 sayMessage 方法,我们用它来向控制台打印消息。
package com.;
public class JavaTester {
public static void main(String args[]) {
JavaTester tester = new JavaTester();
//with type declaration
MathOperation addition = (int a, int b) -> a + b;
//with out type declaration
MathOperation subtraction = (a, b) -> a - b;
//with return statement along with curly braces
MathOperation multiplication = (int a, int b) -> { return a * b; };
//without return statement and without curly braces
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
//without parenthesis
GreetingService greetService1 = message -> System.out.println("Hello " + message);
//with parenthesis
GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
greetService1.sayMessage("Mahesh");
greetService2.sayMessage("Suresh");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation) {
return mathOperation.operation(a, b);
}
}
输出
让我们编译并运行上述程序,这将产生以下结果 −
10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello Mahesh Hello Suresh
以上示例中有以下重要要点需要注意。
Lambda 表达式主要用于定义函数式接口的内联实现,即仅包含单个方法的接口。在上述示例中,我们使用了各种类型的 lambda 表达式来定义
MathOperation接口的operation方法。然后我们定义了GreetingService的sayMessage实现。Lambda 表达式消除了匿名类的需求,为 Java 提供了非常简单却强大的函数式编程能力。
Java Lambda 表达式的作用域
使用 lambda 表达式,你可以引用任何 final 变量或有效 final 变量(仅赋值一次的变量)。如果变量第二次被赋值,lambda 表达式会抛出编译错误。
在 Lambda 表达式中使用常量
在这个示例中,我们有一个函数式接口 GreetingService,它包含一个 sayMessage 方法,我们用它来向控制台打印消息。现在在 JavaTester 类中,我们有一个 final 类字段 salutation,其值为 "Hello! "。现在在 lambda 表达式中,我们可以无错误地使用这个 final 字段。
在 Lambda 表达式中使用常量的示例
public class JavaTester {
final static String salutation = "Hello! ";
public static void main(String args[]) {
GreetingService greetService1 = message -> System.out.println(salutation + message);
greetService1.sayMessage("Mahesh");
}
interface GreetingService {
void sayMessage(String message);
}
}
输出
让我们编译并运行上述程序,这将产生以下结果 −
Hello! Mahesh
在集合中使用 Lambda 表达式
从 Java 8 开始,几乎所有 collection 都得到了增强,可以接受 lambda expression 来对它们执行操作。例如,遍历列表、过滤列表、排序列表等。在这个示例中,我们展示如何使用 lambda expressions 遍历字符串列表并打印所有元素,以及如何仅打印列表中的偶数。
在集合中使用 Lambda 表达式的示例
package com.;
import java.util.ArrayList;
import java.util.List;
public class JavaTester {
public static void main(String args[]) {
// 准备一个字符串列表
List<String> list = new ArrayList<>();
list.add("java");
list.add("html");
list.add("python");
// 使用 lambda 表达式打印列表
// 这里我们将 lambda 表达式传递给 list 对象的 forEach 方法
list.forEach(i -> System.out.println(i));
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
numbers.add(6);
numbers.add(7);
numbers.add(8);
System.out.println(numbers);
// 使用 lambda 表达式过滤列表
// 这里我们将 lambda 表达式传递给 list 对象的 removeIf 方法
// 检查数字是否能被 2 整除
numbers.removeIf( n -> n%2 != 0);
System.out.println(numbers);
}
}
输出
让我们编译并运行上述程序,这将产生以下结果 −
java html python [1, 2, 3, 4, 5, 6, 7, 8] [2, 4, 6, 8]