Supplier 是 Java 8 函数式接口,核心作用:不接收任何参数,直接返回一个结果。
简单理解:它就是一个 “生产工厂”,不用给原料,直接产出产品 → 无入参,有返回值。
一、核心定义
java
运行
@FunctionalInterface
public interface Supplier<T> {
// 唯一抽象方法:无参数,返回一个 T 类型结果
T get();
}
- T:返回值的类型
- 核心方法:
T get() - 专门做:无参数、有返回值的操作(生产、获取、创建)
二、最基础用法(必看)
1. 匿名内部类(老式)
java
运行
import java.util.function.Supplier;
public class SupplierTest {
public static void main(String[] args) {
// 定义一个Supplier:生产一个字符串
Supplier<String> supplier = new Supplier<String>() {
@Override
public String get() {
return "我是Supplier生产的内容";
}
};
// 获取结果
String result = supplier.get();
System.out.println(result);
}
}
2. Lambda 简化(推荐)
java
运行
public class SupplierTest {
public static void main(String[] args) {
// 无参数,直接返回
Supplier<String> supplier = () -> "Lambda 简化版";
// 调用get()获取值
String result = supplier.get();
System.out.println(result);
}
}
三、常用场景:生产 / 创建 / 获取数据
示例 1:生产随机数
java
运行
import java.util.Random;
// 无参数,返回随机整数
Supplier<Integer> randomSupplier = () -> new Random().nextInt(100);
// 获取随机数
int num = randomSupplier.get();
System.out.println("随机数:" + num);
示例 2:创建对象(工厂模式)
java
运行
class User {
private String name = "默认用户";
@Override
public String toString() { return name; }
}
// 无参数,创建并返回User对象
Supplier<User> userSupplier = () -> new User();
// 获取User
User user = userSupplier.get();
System.out.println(user); // 输出:默认用户
四、高级用法:懒加载(延迟执行)
Supplier 最大价值:代码不调用 get () 就不执行,延迟加载。
java
运行
public class SupplierTest {
public static void main(String[] args) {
// 定义时,方法体不会执行!
Supplier<String> lazySupplier = () -> {
System.out.println("开始生产数据...");
return "懒加载完成";
};
System.out.println("定义完成,还没调用get()");
// 调用get()时才真正执行
String result = lazySupplier.get();
System.out.println(result);
}
}
输出:
plaintext
定义完成,还没调用get()
开始生产数据...
懒加载完成
五、实战:封装通用工具方法
把 Supplier 当参数,实现通用获取数据、容错、懒加载。
java
运行
public class SupplierTest {
// 通用工具:获取数据,自动打印日志
public static <T> T getData(Supplier<T> supplier) {
System.out.println("正在获取数据...");
T data = supplier.get(); // 真正执行
System.out.println("获取成功:" + data);
return data;
}
public static void main(String[] args) {
// 获取字符串
String str = getData(() -> "测试数据");
// 获取数字
Integer num = getData(() -> 666);
// 获取对象
User user = getData(User::new); // 方法引用写法
}
}
六、Stream 中的应用
Stream 里很多方法用 Supplier,比如 Stream.generate():
java
运行
import java.util.stream.Stream;
public class SupplierTest {
public static void main(String[] args) {
// 无限生成 10 的数据流
Stream.generate(() -> 10)
.limit(5)
.forEach(System.out::println);
}
}
输出:
plaintext
10
10
10
10
10
七、三大函数式接口对比(必记)
表格
| 接口 | 入参 | 返回值 | 一句话理解 |
|---|---|---|---|
| Supplier | 无 | 有 | 工厂,生产数据(无入有出) |
| Function | 1 个 | 有 | 加工,转换数据(有入有出) |
| Consumer | 1 个 | 无 | 消费,处理数据(有入无出) |
终极口诀:
- 不接收参数,只返回值 → Supplier(生产者)
- 接收参数,返回值 → Function(转换器)
- 接收参数,不返回值 → Consumer(消费者)