Supplier的使用:

16 阅读2分钟

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工厂,生产数据(无入有出)
Function1 个加工,转换数据(有入有出)
Consumer1 个消费,处理数据(有入无出)

终极口诀:

  • 不接收参数,只返回值 → Supplier(生产者)
  • 接收参数,返回值 → Function(转换器)
  • 接收参数,不返回值 → Consumer(消费者)