假设我要在Kotlin中创建BigDecimals列表
[ 0.0, 0.1 .. 9.9 ]
如何在不循环的情况下实现以下目标?
val numbers: List<BigDecimal> = generateNumbers()
fun generateNumbers(): List<BigDecimal> {
val list = ArrayList<BigDecimal>()
for (i in 0..9)
(0..9).mapTo(list) { BigDecimal("$i.$it") }
return list
}
答案 0 :(得分:1)
您也可以使用.flatMap { ... }
来做到这一点,它将结果列表连接成一个列表:
fun generateNumbers(): List<BigDecimal> =
(0..9).flatMap { i ->
(0..9).map {
BigDecimal("$i.$it")
}
}
答案 1 :(得分:1)
另一种创建所需的BigDecimals列表的方法是,预先知道元素的数量以及将公式映射到元素的索引,如下所示:
val numbers = List(100) { index -> BigDecimal(index).scaleByPowerOfTen(-1) }
这里我们创建了一个包含100个元素的列表,其中每个元素都是从其索引(范围为0..99)中按10 -1 缩放的。
答案 2 :(得分:0)
如果您知道每步要添加多少(例如0.1
),也可以改用generateSequence
:
val yourSequence = generateSequence(BigDecimal.ZERO) {
it + BigDecimal("0.1")
}.takeWhile { it < BigDecimal.TEN }
之后,您可以根据需要拨打类似yourSequence.forEach(::println)
的电话。
如果您想使用无限序列,只需跳过takeWhile
,例如满足以下条件:
generateSequence(BigDecimal.ZERO) {
it + BigDecimal("0.1")
}
将其应用于函数(“格式化”以便可以立即看到所有内容):
fun generateNumbers(from: BigDecimal = BigDecimal.ZERO,
uptoExclusive: BigDecimal = BigDecimal.TEN,
step: BigDecimal = BigDecimal("0.1")
) = generateSequence(from) { it + step }
.takeWhile { it < uptoExclusive }
样品用量:
generateNumbers().forEach(::println)
generateNumbers(BigDecimal.ONE, step = BigDecimal.ONE).forEach(::println)