如何从传入的Stream创建Supplier?解决Stream仅能消费一次问题
实现Stream到Supplier<Stream>的转换
你的实现思路完全正确:
- 由于Stream只能被消费一次,将原Stream的元素缓存到List中是可靠的解决方案。每次调用Supplier的
get()方法时,都会基于缓存的List生成全新的Stream实例,保证可以重复获取可用的Stream。
补充几点注意事项:
- 若使用Java 16之前的版本,
src.toList()需要替换为src.collect(Collectors.toList()),因为toList()是Java 16新增的Stream方法。 - 无限流场景不适用:如果传入的
src是无限Stream(比如Stream.generate(Math::random)),调用toList()会导致线程持续阻塞,因为无法收集完无限多的元素。
兼容Java 8+的代码示例:
import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; public class StreamSupplierUtil { public static <T> Supplier<Stream<T>> cache(Stream<T> src) { List<T> cachedList = src.collect(Collectors.toList()); return cachedList::stream; } }
内容的提问来源于stack exchange,提问作者Zé Antônio
相关产品推荐
相关产品推荐

