Java中如何将Iterator<Integer>转换为PrimitiveIterator.OfInt
Iterator 转换为 PrimitiveIterator.OfInt 实现方案
以下两种实现均适用于Java 8及以上版本:
方案1:手动实现适配器(性能最优)
直接实现PrimitiveIterator.OfInt核心接口方法,逻辑透明无额外开销:
import java.util.Iterator; import java.util.Objects; import java.util.PrimitiveIterator; import java.util.function.IntConsumer; public static PrimitiveIterator.OfInt convertToOfInt(Iterator<Integer> iterator) { Objects.requireNonNull(iterator); return new PrimitiveIterator.OfInt() { @Override public boolean hasNext() { return iterator.hasNext(); } @Override public int nextInt() { // 自动拆箱,若原迭代器返回null会抛出NullPointerException,符合原始类型语义 return iterator.next(); } @Override public void forEachRemaining(IntConsumer action) { Objects.requireNonNull(action); iterator.forEachRemaining(i -> action.accept(i)); } }; }
方案2:基于Stream API简化实现
代码更简洁,适合日常业务场景使用:
import java.util.Iterator; import java.util.PrimitiveIterator; import java.util.Spliterators; import java.util.stream.StreamSupport; public static PrimitiveIterator.OfInt convertToOfInt(Iterator<Integer> iterator) { return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false) // 可按需添加 .filter(Objects::nonNull) 过滤null元素避免拆箱异常 .mapToInt(Integer::intValue) .iterator(); }
注意事项
- 两种方案均为视图转换,不会预加载所有元素,内存开销极低,原迭代器的状态变更会同步到转换后的迭代器
- 若原Iterator存在null元素,拆箱时会抛出NullPointerException,可根据业务需要提前过滤null,或在nextInt方法中添加默认值处理逻辑
内容的提问来源于stack exchange,提问作者ruplet
相关产品推荐
相关产品推荐

