简介
在 Java 中,Supplier 是一个函数式接口(位于 java.util.function 包),它的作用是不接受任何参数,但返回一个指定类型的值(供给一个值)。其抽象方法为 T get(),常用于延迟计算、懒加载或作为工厂方法。
核心作用
- 延迟计算:需要时才调用 get() 方法获取值,避免提前计算资源。
- 解耦生产逻辑:将值的生成逻辑封装在 Supplier 中,使代码更灵活。
- 函数式编程:作为参数传递,支持更简洁的代码。
示例代码
1. 基本用法:生成随机数
import java.util.Random;
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
// 创建一个 Supplier,用于生成随机整数
Supplier<Integer> randomSupplier = () -> new Random().nextInt(100);
// 调用 get() 方法获取值
System.out.println(randomSupplier.get()); // 每次调用可能返回不同的值
}
}
2. 延迟计算:避免不必要的对象创建
本例中是结合Optional类实现。
import java.util.Optional;
import java.util.function.Supplier;
public class LazyEvaluation {
public static void main(String[] args) {
// 创建一个可能为 null 的值
String nullableValue = null;
// 使用 Supplier 延迟创建默认值(仅在需要时执行)
Supplier<String> defaultValueSupplier = () -> {
System.out.println("生成默认值...");
return "默认值";
};
// 使用 Optional 结合 Supplier 获取值
String result = Optional.ofNullable(nullableValue)
.orElseGet(defaultValueSupplier);
System.out.println(result); // 输出:默认值
}
}
3. 作为方法参数:灵活注入生成逻辑
import java.util.function.Supplier;
public class SupplierAsParameter {
// 方法接受 Supplier 作为参数
public static <T> T getValue(Supplier<T> supplier) {
return supplier.get();
}
public static void main(String[] args) {
// 传入不同的 Supplier 实现
String result1 = getValue(() -> "Hello");
Integer result2 = getValue(() -> 123);
System.out.println(result1); // 输出:Hello
System.out.println(result2); // 输出:123
}
}
常见应用场景
- 默认值提供:与 Optional 结合,仅在值不存在时生成默认值。
- 工厂模式:通过 Supplier 封装对象创建逻辑,解耦对象的使用和创建。
- 缓存加载:在缓存失效时,使用 Supplier 重新加载数据。
- 日志记录:避免在日志级别不满足时构造复杂的日志消息。