本文介绍如何通过 supplier 包装 + flatmap 实现昂贵方法的延迟执行,确保仅在必要时才调用 expensive(),避免 stream.concat 提前触发副作用。
在 Java Stream 处理中,若需「先查本地列表,未命中再调用昂贵方法获取额外数据」,直接使用 Stream.concat(a.stream(), expensive().stream()) 是错误的——因为 expensive() 会在 Stream 构建阶段立即执行(即非惰性),违背了“按需调用”的初衷。
正确解法是将数据源抽象为 Supplier>,利用 Stream 的懒加载特性:只有当终端操作(如 findFirst())真正消费元素时,才会逐个触发 supplier.get(),从而实现真正的惰性求值。
以下是推荐的单行、可读性强且符合函数式风格的实现:
public static OptionalfindTarget(String input, List myList) { return Stream. >>of( () -> myList, () -> expensive()) .flatMap(supplier -> supplier.get().stream()) .filter(o -> o.hasName(input)) .findFirst(); }
✅ 关键点解析:
⚠️ 注意事项:

? 进阶提示:
如需支持更多动态数据源(例如按优先级依次尝试多个远程 API),可将 Stream.of(...) 替换为 List
这种基于 Supplier + flatMap 的惰性拼接模式,是 Java 函数式编程中处理“条件性副作用”的经典范式,兼顾简洁性、可读性与性能。