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(消费者)
相关推荐
阿巴斯甜2 小时前
Function 用法:
java
做个文艺程序员2 小时前
流式输出(SSE)在 Spring Boot 中的实现【OpenClAW + Spring Boot 系列 第3篇】
java·spring boot·后端
逻辑驱动的ken2 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
小手cool2 小时前
如何在Java中根据另一个配对集合对一个集合进行排序
java·开发语言
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【28】Nacos Skill 管理中心功能说明
java·人工智能·spring
升鲜宝供应链及收银系统源代码服务2 小时前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码
Han.miracle3 小时前
Redis 全套笔记:基础 API + 三大架构 + 缓存三大问题
java·windows·redis
zzb15803 小时前
Fragment 生命周期深度图解:从 onAttach 到 onDetach 完整流程(面试必备)
android·java·面试·安卓
银色火焰战车3 小时前
浅析golang中的垃圾回收机制(GC)
java·jvm·golang