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(消费者)
相关推荐
Pluchon11 小时前
Java个人综合项目——萌部落社区V2.0
java·python·spring·spring cloud·postman·idea
梦雨生生12 小时前
java开发工具(学习第一天)
java·开发语言·学习
她说可以呀12 小时前
Spring-ai-alibaba文生图
java·人工智能·spring
松仔log14 小时前
Java中级——组合和继承
android·java·开发语言
不才不才不不才14 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
snow@li15 小时前
HikariCP:高性能数据库连接池全景深入梳理
java·数据库
sugar__salt15 小时前
Spring 三层架构与 IoC、依赖注入完全指南
java·spring boot·后端·spring·架构·maven·intellij-idea
edwarddamon15 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端
Raas10016 小时前
MAIGateway,魔芋企业级AI网关的FinAPI成本竞争力设计
java·后端·网关·api网关·魔芋ai·finapi·mai gateway
evans在进步16 小时前
Spring AI 从入门到实战:用 Java 实现大模型对话与 Tool Calling
java·人工智能·spring