Scala如何实现支持多数值类型的固定步长序列生成函数
Scala 多数值类型通用序列生成实现方案
借助Scala标准库提供的Numeric类型类即可实现跨Int、Long、Float、Double等数值类型的泛型序列生成逻辑,同时完全兼容你原有的舍入规则和生成逻辑,简化实现如下:
import java.text.DecimalFormat import scala.annotation.tailrec // 通用舍入方法:浮点类型保留两位小数,整型直接返回原值 def round[T](elem: T)(using num: Numeric[T]): T = elem match { case f: Float => new DecimalFormat("###.##").format(f).toFloat.asInstanceOf[T] case d: Double => new DecimalFormat("###.##").format(d).toDouble.asInstanceOf[T] case _ => elem } // 泛型序列生成方法,逻辑和原有Double版本完全对齐 def arrange[T: Numeric](start: T, end: T, increment: T): Seq[T] = { val num = summon[Numeric[T]] @tailrec def recurse(acc: Seq[T], current: T): Seq[T] = { if (num.gteq(current, end)) acc else { val next = round(num.plus(current, increment)) recurse(acc :+ next, next) } } recurse(Seq.empty[T], start) }
测试示例
原有Double场景调用
和你原有版本输出完全一致:
arrange(0.0, 0.55, 0.05) foreach println
输出:
0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55
其他数值类型调用
- Int类型示例:
// 生成1到10之间步长为2的序列 arrange(1, 10, 2) foreach println // 输出:3、5、7、9
- Long类型示例:
// 生成100到200之间步长为20的序列 arrange(100L, 200L, 20L) foreach println // 输出:120、140、160、180
- Float类型示例:
// 生成0到0.3之间步长为0.05的序列 arrange(0.0f, 0.3f, 0.05f) foreach println // 输出:0.05、0.1、0.15、0.2、0.25、0.3
如果你使用的是Scala 2版本,只需将代码中的
using替换为implicit,summon[Numeric[T]]替换为implicitly[Numeric[T]]即可正常运行。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

