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
相关产品推荐
相关产品推荐

