You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Supplier函数式接口除自定义场景外是否有官方实用案例?

Java中Supplier的官方内置实用案例

当然有,Java标准库中很多核心API都用到了Supplier<T>,核心是利用它延迟执行、按需生成值的特性,下面是几个最常见的场景:

  • Optional.orElseGet()
    当Optional对象为空时,通过Supplier提供默认值,相比orElse(),它只有在需要时才会生成值,避免不必要的对象创建:

    Optional<String> maybeUsername = Optional.empty();
    String username = maybeUsername.orElseGet(() -> "guest");
    
  • Stream.generate()
    用于生成无限流,Supplier会被反复调用以生成流的每个元素:

    // 生成包含5个随机数的流
    Stream<Double> randomNumbers = Stream.generate(Math::random);
    randomNumbers.limit(5).forEach(System.out::println);
    
  • ThreadLocal.withInitial()
    为ThreadLocal提供线程专属的初始化逻辑,每个线程首次访问时会通过Supplier生成自己的实例,避免线程安全问题:

    ThreadLocal<SimpleDateFormat> threadSafeDateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    
  • Collectors.toCollection()
    在收集Stream结果时,通过Supplier指定要使用的集合类型:

    // 将流收集到LinkedList中
    List<String> result = Stream.of("a", "b", "c")
                                .collect(Collectors.toCollection(LinkedList::new));
    
  • CompletableFuture.supplyAsync()
    用于异步执行有返回值的任务,Supplier的逻辑会在单独的线程中运行:

    CompletableFuture<Integer> asyncTask = CompletableFuture.supplyAsync(() -> {
        // 模拟耗时计算
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return 42;
    });
    

这些场景的共同点是:Supplier允许我们把值的生成逻辑封装起来,推迟到真正需要的时候再执行,这在优化性能、实现惰性初始化、处理线程安全等场景中非常实用。

内容的提问来源于stack exchange,提问作者Mrinal Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:10:37