Supplier的使用:

Supplier 是 Java 8 函数式接口 ,核心作用:不接收任何参数,直接返回一个结果。

简单理解:它就是一个 "生产工厂",不用给原料,直接产出产品 → 无入参,有返回值。

一、核心定义

java

运行

csharp 复制代码
@FunctionalInterface
public interface Supplier<T> {
    // 唯一抽象方法:无参数,返回一个 T 类型结果
    T get();
}
  • T:返回值的类型
  • 核心方法:T get()
  • 专门做:无参数、有返回值的操作(生产、获取、创建)

二、最基础用法(必看)

1. 匿名内部类(老式)

java

运行

typescript 复制代码
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

运行

typescript 复制代码
public class SupplierTest {
    public static void main(String[] args) {
        // 无参数,直接返回
        Supplier<String> supplier = () -> "Lambda 简化版";
        
        // 调用get()获取值
        String result = supplier.get();
        System.out.println(result);
    }
}

三、常用场景:生产 / 创建 / 获取数据

示例 1:生产随机数

java

运行

dart 复制代码
import java.util.Random;

// 无参数,返回随机整数
Supplier<Integer> randomSupplier = () -> new Random().nextInt(100);

// 获取随机数
int num = randomSupplier.get();
System.out.println("随机数:" + num);

示例 2:创建对象(工厂模式)

java

运行

typescript 复制代码
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

运行

csharp 复制代码
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

scss 复制代码
定义完成,还没调用get()
开始生产数据...
懒加载完成

五、实战:封装通用工具方法

把 Supplier 当参数,实现通用获取数据、容错、懒加载。

java

运行

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

运行

arduino 复制代码
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(消费者)
相关推荐
骇客野人7 分钟前
Java BIO / NIO / AIO 完整详解 + 编程技巧
java·开发语言·nio
霸道流氓气质10 分钟前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
m0_5873830016 分钟前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
栖凤22 分钟前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python
小师兄吃牛肉22 分钟前
Java 同步系列之 ZooKeeper 分布式锁
java·分布式·java-zookeeper
马剑威(威哥爱编程)35 分钟前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
Gauss松鼠会36 分钟前
【GaussDB】破除gaussdb ugin索引支持中文模糊查询的迷思-字符序
java·运维·服务器·网络·数据库·gaussdb·经验总结
IT研究室43 分钟前
最新计算机毕业设计选题推荐-基于spring boot的心桥·心理健康综合服务平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
Sarvartha1 小时前
Object 类
java·开发语言
知守观1 小时前
feign-core 就在依赖树里,运行时却找不到类:一次 provided scope 引发的启动失败排查
java·spring cloud·maven