Scala超Int32大小大列表使用iterator.count返回值溢出如何解决
Scala超大List长度统计Int溢出问题解决方案
Scala标准库中immutable.List的size、count方法默认返回Int类型,Int32的存储上限为2^31-1(即2147483647),当列表元素总量或符合条件的元素量超过该值时,会发生整数溢出,得到错误的统计结果,可通过以下方案解决:
自定义返回Long类型的长度统计方法
基于foldLeft实现全量长度统计,全程使用Long类型作为累加器,从根源上避免溢出:// 统计全列表长度,返回Long类型 def getLongSize[A](list: List[A]): Long = list.foldLeft(0L) { (accumulator, _) => accumulator + 1 }如果需要替代原生
count方法统计符合特定条件的元素量,同理实现即可:// 统计符合条件的元素数量,返回Long类型 def getLongCount[A](list: List[A], predicate: A => Boolean): Long = list.foldLeft(0L) { (accumulator, element) => if (predicate(element)) accumulator + 1 else accumulator }上述实现无额外依赖,性能和原生
size/count方法基本持平,返回的Long类型支持的统计上限为2^63-1,足以覆盖绝大多数超大列表的统计需求。注意事项
超大的immutable.List本身会占用极高的内存资源,64位JVM环境下单个对象引用占8字节,仅存储20亿个元素的List就需要至少16GB的堆内存,实际使用前请先确认JVM堆内存配置满足承载要求。
内容的提问来源于stack exchange,提问作者Samson Hu
相关产品推荐
相关产品推荐

