好的!下面给你整理一份关于 Java 8 中的 Supplier
接口及函数式接口 的总结,帮你快速理解和掌握核心概念和用法。
Java 8 学习之 Supplier 与函数式接口总结
一、什么是函数式接口(Functional Interface)
- 定义:只包含一个抽象方法的接口,称为函数式接口。
- 特点:
- 可以隐式转换为 lambda 表达式
- 使用
@FunctionalInterface
注解可以明确标识接口为函数式接口(非必需,但推荐)
@FunctionalInterface
public interface MyFunctionalInterface {
void execute();
}
- Java 8 标准库中有很多函数式接口,位于
java.util.function
包中。
二、Supplier 接口简介
- 接口定义:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
- 作用:无输入参数,提供一个结果。
- 通俗理解:提供者、生产者,不接受参数,返回一个指定类型的结果。
三、Supplier 的典型用法
1. 生成对象或数据
Supplier<String> supplier = () -> "Hello World";
System.out.println(supplier.get()); // 输出:Hello World
2. 延迟执行或懒加载
public String getConfig(Supplier<String> supplier) {
// 只有在真正需要时才调用 supplier.get()
return supplier.get();
}
String config = getConfig(() -> loadConfigFromFile());
四、常见函数式接口概览
接口名 | 方法签名 | 参数 | 返回值 | 用途说明 |
---|---|---|---|---|
Supplier<T> | T get() | 无 | T | 生产数据,无输入 |
Consumer<T> | void accept(T t) | T | 无 | 消费数据,无返回 |
Function<T,R> | R apply(T t) | T | R | 输入 T,返回 R |
Predicate<T> | boolean test(T t) | T | boolean | 判断条件,返回布尔值 |
UnaryOperator<T> | T apply(T t) | T | T | 输入输出同类型的函数 |
BinaryOperator<T> | T apply(T t1, T t2) | T, T | T | 两个同类型输入,输出同类型 |
五、代码示例 — Supplier 实战
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
// 创建 Supplier,生成随机数
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println("随机数1: " + randomSupplier.get());
System.out.println("随机数2: " + randomSupplier.get());
// 延迟创建对象
Supplier<Person> personSupplier = () -> new Person("张三", 25);
Person p = personSupplier.get();
System.out.println(p);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + "," + age + "岁";
}
}
六、总结
Supplier<T>
是无参有返回值的函数式接口,适合懒加载、生成数据、延迟执行。- Java 8 标准库中包含丰富的函数式接口,配合 lambda 表达式极大提高代码简洁度和可读性。
- 结合 Stream API、Optional 等常用工具,函数式接口发挥强大威力。
发表回复