如何创建元素数量上限为LONG.MAX_VALUE的迭代器?
如何创建元素上限为LONG.MAX_VALUE的Scala迭代器?
你的问题核心在于:Array的长度受限于Int类型(Java/Scala中数组长度只能用Int定义),所以Array.fill(amount)无法接收Long类型的参数;更关键的是,就算能接收,生成一个长度接近Long.MAX_VALUE的数组也会直接耗尽内存,完全不可行。
要实现支持Long级元素数量的迭代器,必须用惰性生成的方式——不一次性创建所有元素,而是按需生成。下面是可行的解决方案:
方案1:自定义惰性迭代器
先实现一个能重复生成指定次数(Long类型)元素的迭代器,再配合flatMap使用:
class MyClass { // 类实现细节 } // 辅助方法:生成重复n次目标元素的惰性迭代器 private def repeatElement[A](elem: => A, n: Long): Iterator[A] = { var remaining = n new Iterator[A] { override def hasNext: Boolean = remaining > 0 override def next(): A = { if (remaining <= 0) throw new NoSuchElementException("Iterator exhausted") remaining -= 1 elem } } } // 修改后的expandMyClass方法 private def expandMyClass(notExpanded: Iterator[MyClass], amount: Long): Iterator[MyClass] = { notExpanded.flatMap(_ => repeatElement(MyClass(), amount)) }
方案2:用Scala内置的范围迭代器简化实现
Scala提供了支持Long类型的范围迭代器,可以更简洁地实现重复生成逻辑:
class MyClass { // 类实现细节 } private def expandMyClass(notExpanded: Iterator[MyClass], amount: Long): Iterator[MyClass] = { notExpanded.flatMap(_ => Iterator.range(0L, amount).map(_ => MyClass())) }
原理说明
这两种方案都是基于Iterator的惰性特性:只有当调用next()方法时,才会生成新的MyClass实例,不会一次性在内存中创建所有元素。这样不仅支持Long级别的元素数量上限,还能避免内存溢出问题。
内容的提问来源于stack exchange,提问作者stackoverflowflowflwofjlw
相关产品推荐
相关产品推荐

