如何在没有循环的情况下在Kotlin中生成BigDecimals列表?

时间:2018-08-29 14:24:23

标签: kotlin

假设我要在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
}

3 个答案:

答案 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)