Java 8 引入了 lambda 表达式和函数式接口,是 Java 语言中一个重要的特性。本文将介绍 lambda 表达式和函数式接口的基本概念和语法,并分别举出两个示例来说明如何使用它们。
什么是 Lambda 表达式
Lambda 表达式是一种语法糖,它允许我们直接以内联方式为一个函数赋值,即在不创建单独的方法的情况下,使用表达式创建匿名函数,并将其传递给其他方法。
Lambda 表达式可以具有零个或多个参数,其中每个参数的类型可以是不同的,也可以返回一个值或根本不返回值。
Lambda 表达式的基本语法如下:
(parameters) -> expression
或者
(parameters) -> { statements; }
其中,parameters 表示函数的参数列表,expression 表示函数的执行代码或语句的返回值,statements 表示函数的执行代码或语句。箭头符号 "->" 是 Java 中 Lambda 表达式的特征标识符。
什么是函数式接口
函数式接口是只有一个抽象方法的接口,该接口按照其精神被描述为函数类型。在许多情况下,它往往被用作 Lambda 表达式的类型。
函数式接口的特征是它只有一个抽象方法,并且从 Object 类继承的其他方法不被计入抽象方法计数。使用注解@FunctionalInterface可以声明接口为函数式接口,并让编译器进行检查。
如果定义的接口不符合函数式接口的标准,编译器会抛出错误,以提示我们应该重新设计接口,并把所有方法签名移到一个更合适的地方上,或者可以将不必要的方法标记为默认方法。
怎么使用 Lambda 表达式和函数式接口
下面的示例展示了如何使用 Lambda 表达式和函数式接口。
示例一:使用 Lambda 表达式和函数式接口对数字进行操作
假如我们有一个数字列表,并且我们需要对列表中的每个元素进行操作,可以使用 Lambda 表达式和函数式接口来完成。
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class LambdaDemo {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
System.out.println("Print all numbers:");
eval(nums, n -> true);
System.out.println("\nPrint even numbers:");
eval(nums, n -> n % 2 == 0);
System.out.println("\nPrint odd numbers:");
eval(nums, n -> n % 2 == 1);
}
public static void eval(List<Integer> nums, Predicate<Integer> condition) {
for (Integer n : nums) {
if (condition.test(n)) {
System.out.print(n + " ");
}
}
}
}
输出结果如下:
Print all numbers:
1 2 3 4 5 6 7 8 9 10
Print even numbers:
2 4 6 8 10
Print odd numbers:
1 3 5 7 9
示例二:使用 Lambda 表达式和函数式接口对字符串进行操作
下面的示例展示了如何使用 Lambda 表达式和函数式接口来过滤列表中的字符串。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class LambdaDemo {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>(Arrays.asList("apple", "banana", "cherry", "date"));
System.out.println("Fruits list: " + fruits);
System.out.println("\nPrint all fruits with A:");
eval(fruits, str -> str.startsWith("a"));
System.out.println("\nPrint all fruits with E:");
eval(fruits, str -> str.startsWith("e"));
}
public static void eval(List<String> fruits, Predicate<String> condition) {
for (String fruit : fruits) {
if (condition.test(fruit)) {
System.out.print(fruit + " ");
}
}
}
}
输出结果如下:
Fruits list: [apple, banana, cherry, date]
Print all fruits with A:
apple
Print all fruits with
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java特性 Lambda 表达式和函数式接口 - Python技术站