如何在Java中实现类似C#的单元素转IEnumerable懒加载功能?
Java中实现C#风格的单个元素懒加载Iterable/Stream
在C#中可以通过扩展方法结合yield return实现单个元素到懒加载IEnumerable<T>的转换:
static class Extensions { static IEnumerable<T> Yield<T>(this T t) { yield return t; } } // 使用方式 var myList = new List<string>("foo".Yield());
针对你想要Java中等价懒加载实现的需求,以下是两种符合要求的方案:
1. 使用Stream API(推荐)
Java的Stream.of()方法会返回一个懒加载的单元素Stream,无需预先创建堆上集合,只有执行终端操作(如收集为List、遍历)时才会处理元素:
// 获取单元素Stream Stream<String> singleElementStream = Stream.of("foo"); // 如果需要Iterable类型,可通过lambda转换 Iterable<String> singleElementIterable = () -> Stream.of("foo").iterator(); // 直接用于需要Iterable参数的场景 List<String> myList = new ArrayList<>(singleElementIterable);
2. 自定义模拟yield的懒加载Iterable
Java没有yield关键字,但可以通过实现Iterable和Iterator来手动模拟懒加载的单元素序列:
public static <T> Iterable<T> yield(T element) { return () -> new Iterator<>() { private boolean hasNext = true; @Override public boolean hasNext() { return hasNext; } @Override public T next() { if (!hasNext) { throw new NoSuchElementException(); } hasNext = false; return element; } }; }
使用方式和C#的Yield方法类似:
List<String> myList = new ArrayList<>(yield("foo"));
这个实现完全是懒加载的,只有在遍历过程中才会返回元素,不会提前创建额外的集合对象。
另外,Java的Stream API提供了和C# Linq类似的链式操作、懒加载能力,在大多数处理可枚举序列的场景下,都可以替代C#的IEnumerable用法。
内容的提问来源于stack exchange,提问作者Kjara
相关产品推荐
相关产品推荐

