Java Lambda表达式常用的函数式接口

Java 8引入了Lambda表达式,极大地简化了代码编写,使得函数式编程在Java中变得更加便捷,本文将详细介绍Java Lambda表达式常用的函数式接口,包括内置和自定义的函数式接口,并通过具体示例进行说明。
一、Lambda表达式概述
Lambda表达式是Java 8引入的一种匿名函数,它允许开发者以更加简洁的方式实现接口,特别是只有一个抽象方法的函数式接口,Lambda表达式的基本形式如下:
(parameters) > expression
或
(parameters) > { statements; }
这里的参数可以是零个、一个或多个,表达式或语句块则是Lambda表达式的主体部分,Lambda表达式使函数成为Java中的一等公民,可以作为参数传递,也可以作为返回值。
二、函数式接口
函数式接口是只定义了一个抽象方法的接口,任何Lambda表达式的目标类型都是一个函数式接口,Java内置的Runnable和Comparator等接口都是典型的函数式接口,自Java 8起,为了明确指出某个接口是函数式接口,可以使用@FunctionalInterface注解进行标注。
1. Java内置函数式接口
Java 8提供了几个常见的函数式接口,主要位于java.util.function包中,这些接口广泛应用于Java的集合操作和流式API中。
| 接口名称 | 方法签名 | 说明 |
| Function |
R apply(T t) | 接受一个参数并返回一个结果 |
| Predicate |
boolean test(T t) | 接受一个参数并返回一个布尔值 |
| Consumer |
void accept(T t) | 接受一个参数但不返回结果 |
| Supplier |
T get() | 无参数,返回一个结果 |
| UnaryOperator |
T apply(T t) | 一元操作符,接受一个参数并返回同类型结果 |
| BinaryOperator |
T apply(T t1, T t2) | 二元操作符,接受两个参数并返回同类型结果 |
| BiFunction |
R apply(T t, U u) | 接受两个参数并返回一个结果 |
示例:使用Function和Predicate接口
import java.util.function.Function;
import java.util.function.Predicate;
public class LambdaExample {
public static void main(String[] args) {
// 使用Function接口
Function<Integer, Integer> square = x > x * x;
System.out.println(square.apply(5)); // 输出 25
// 使用Predicate接口
Predicate<String> isEmpty = s > s.isEmpty();
System.out.println(isEmpty.test("")); // 输出 true
}
}
2. 自定义函数式接口

除了Java内置的函数式接口外,开发者也可以根据需求定义自己的函数式接口,任何接口只要满足只有一个抽象方法的要求,就可以用作Lambda表达式的目标类型。
@FunctionalInterface
public interface MyFunction {
int calculate(int a, int b);
}
public class CustomFunctionalInterfaceExample {
public static void main(String[] args) {
MyFunction addition = (a, b) > a + b;
System.out.println(addition.calculate(10, 20)); // 输出 30
}
}
3. 函数式接口与OOF(面向函数编程)
通过函数式接口,Java将传统的面向对象编程与函数式编程有机结合,这一切都依赖于接口的抽象和Lambda表达式的简化表示,函数式接口为函数式编程的灵活性提供了坚实的基础,使Java既保留了面向对象的模块化设计,又具备了函数式编程的简洁性和高效性。
三、方法引用
方法引用是Java 8引入的另一种简化Lambda表达式的语法形式,它允许开发者直接引用已有的方法,而不必通过Lambda表达式显式地实现,这提高了代码的可读性和复用性。
1. 方法引用的种类
| 类型 | 语法形式 | 示例 |
| 静态方法引用 | ClassName::staticMethod | Math::max |
| 对象实例方法引用 | instance::method | System.out::println |
| 类实例方法引用 | ClassName::method | String::length |
| 构造方法引用 | ClassName::new | ArrayList::new |
2. 示例:使用方法引用
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class MethodReferenceExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println); // 使用对象的实例方法引用
}
}
四、综合案例:Lambda表达式与函数式接口的结合
假设有一组商品数据,我们需要对这些商品进行过滤和转换操作,以下是如何使用Lambda表达式和函数式接口来实现这一需求的示例。

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.function.Function;
import java.util.stream.Collectors;
class Product {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
public class LambdaAndFunctionalInterfaceExample {
public static void main(String[] args) {
List<Product> products = Arrays.asList(
new Product("Apple", 1.2),
new Product("Banana", 0.5),
new Product("Orange", 0.8)
);
// 过滤价格大于1的商品,并将名称转换为大写
List<String> filteredProducts = products.stream()
.filter(p > p.getPrice() > 1) // 使用Lambda表达式进行过滤
.map(Product::getName) // 使用方法引用进行映射
.map(String::toUpperCase) // 使用方法引用进行转换
.collect(Collectors.toList());
System.out.println(filteredProducts); // 输出 [APPLE]
}
}
在这个例子中,我们使用了Lambda表达式和方法引用来简化代码,使代码更加简洁和易读。
五、相关问题与解答栏目
问题1:什么是函数式接口?
答:函数式接口是Java中仅包含一个抽象方法的接口,它们通常用来作为Lambda表达式的目标类型,Java 8引入了@FunctionalInterface注解,用来标识函数式接口,这个注解是可选的,但如果加上,会强制编译器检查该接口是否符合函数式接口的定义(只有一个抽象方法)。
问题2:如何使用方法引用简化Lambda表达式?
答:方法引用是Java 8引入的另一种简化Lambda表达式的语法形式,它允许开发者直接引用已有的方法,而不必通过Lambda表达式显式地实现,方法引用分为四种类型:静态方法引用、对象实例方法引用、类实例方法引用和构造方法引用,使用方法引用可以提高代码的可读性和复用性。System.out::println是对象实例方法引用,Math::max是静态方法引用。
到此,以上就是小编对于“Java Lambda表达式常用的函数式接口”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。











