欢迎访问宙启技术站
智能推送

lambda表达式的使用及相关函数式接口介绍

发布时间:2023-06-29 03:09:44

在Java中,lambda表达式是一种能够以更简洁方式代替匿名内部类的语法。它的引入极大地增强了Java语言在函数式编程方面的表达能力。lambda表达式可以用于替代一些单一方法的接口,使代码更加清晰、简洁、易读。

lambda表达式的语法为:

(parameters) -> expression // 单个参数

(parameters) -> { statements; } // 多个参数

下面是一个使用lambda表达式的示例:

List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(10);
numbers.add(3);

numbers.forEach((n) -> { System.out.println(n); });  // 自动装箱

numbers.removeIf((n) -> n % 2 == 0);  // 删除偶数

numbers.sort((a, b) -> b.compareTo(a));  // 降序排序

在上面的例子中,我们使用了lambda表达式来遍历集合中的元素、删除偶数元素和对集合进行降序排序。

函数式接口是lambda表达式的基础,它是一种只包含一个抽象方法的接口,可以用作lambda表达式的类型。Java中的函数式接口可以用@FunctionalInterface注解进行标识。

Java 8引入了许多函数式接口,这些接口有助于结构化和处理各种类型的数据。以下是Java中常用的一些函数式接口的简要介绍:

1. Consumer<T>:接收一个输入参数并返回void的函数接口。可以通过andThen方法链接多个Consumer。

Consumer<String> printUpperCase = (str) -> System.out.println(str.toUpperCase());
Consumer<String> printLowerCase = (str) -> System.out.println(str.toLowerCase());

printUpperCase.accept("Hello");   // 输出: HELLO
printLowerCase.accept("WORLD");   // 输出: world
printUpperCase.andThen(printLowerCase).accept("Java");   // 输出: JAVA
java

2. Predicate<T>:函数式接口,用于判断某个条件是否为true。可以通过and、or、negate等方法组合Predicate。

Predicate<Integer> isEven = (n) -> n % 2 == 0;
Predicate<Integer> isPositive = (n) -> n > 0;

boolean result = isEven.and(isPositive).test(6);   // 返回 true

3. Function<T, R>:接受一个输入参数,并返回一个结果。可以通过andThen方法链式调用多个Function。

Function<Integer, String> toString = (n) -> Integer.toString(n);
Function<String, Integer> toInt = (str) -> Integer.parseInt(str);

String result = toString.andThen(toInt).apply(100);   // 返回 "100"

4. Supplier<T>:无参数调用,并返回一个结果。与Function不同的是,它没有输入参数。

Supplier<LocalDate> today = () -> LocalDate.now();
LocalDate date = today.get();  // 返回当前日期

5. BiFunction<T, U, R>:接受两个输入参数,并返回一个结果。可以通过andThen方法链式调用多个BiFunction。

BiFunction<Integer, Integer, Integer> sum = (a, b) -> a + b;
BiFunction<Integer, Integer, String> toString = (a, b) -> Integer.toString(a) + Integer.toString(b);

int result = sum.andThen(toString).apply(2, 3);   // 返回 "5"

除了上述介绍的函数式接口,Java还有一些其他的函数式接口,如Supplier、UnaryOperator、BinaryOperator等,它们能够为开发者提供更多的编程便利性。

总的来说,lambda表达式和函数式接口是Java 8引入的最重要的特性之一。它们大大简化了Java代码的书写,使得开发者能够更轻松地进行函数式编程和处理不同类型的数据。使用lambda表达式和函数式接口可以提高代码的可读性和可维护性,是Java开发中不可或缺的部分。