Kotlin:列表中BigDecimal的总和

时间:2016-09-30 14:14:34

标签: kotlin

我有一个我要过滤的列表,然后返回一个带有金额总和的id地图:

/*!
CSS for project
*/

#devices {
    display: table;
    width: 100%;
    table-layout: fixed;
}
.row {
    display: table-row;
    vertical-align: middle;
}

(...)

" it.amount"是BigDecimal,但看起来sumBy只是Int。

对于java 8,它是:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css" />

Kotlin有办法吗?

5 个答案:

答案 0 :(得分:14)

就像您在java中使用Collectors.reducing一样,您可以在Kotlin中使用foldreduce扩展函数:

val bigDecimals: List<BigDecimal> = ...
val sum = bigDecimals.fold(BigDecimal.ZERO) { acc, e -> acc + e }
// or
val sum2 = bigDecimals.fold(BigDecimal.ZERO, BigDecimal::add)

答案 1 :(得分:7)

您可以创建自己的.gray-out { -webkit-filter: grayscale(100%); filter: grayscale(100%); filter: gray; filter: url("data:image/svg+xml;utf8,<svg>...</svg>");/* Move this line up */ } extension function,类似于sumByDouble。 e.g:

sumByBigDecimal

使用示例:

/**
 * Returns the sum of all values produced by [selector] function applied to each element in
 * the collection.
 */
inline fun <T> Iterable<T>.sumByBigDecimal(selector: (T) -> BigDecimal): BigDecimal {
    var sum: BigDecimal = BigDecimal.ZERO
    for (element in this) {
        sum += selector(element)
    }
    return sum
}

答案 2 :(得分:2)

结合折叠方法和扩展函数方法,您可以这样做:

fun Iterable<BigDecimal>.sumByBigDecimal(): BigDecimal {
    return this.fold(BigDecimal.ZERO) { acc, e -> acc + e }
}

fun <T> Iterable<T>.sumByBigDecimal(transform: (T) -> BigDecimal): BigDecimal {
    return this.fold(BigDecimal.ZERO) { acc, e -> acc + transform.invoke(e) }
}

像这样使用它们:

listOfBigs.sumByBigDecimal()

listOfWidgets.sumByBigDecimal { it.price }

答案 3 :(得分:0)

如果列表不为空,则也可以使用reduce

val bigDecimals: List<BigDecimal> = ...
val sum = bigDecimals.reduce(BigDecimal::add)

如果列表可以为空,则您需要foldBigDecimal.ZERO,就像接受的答案所建议的那样。

答案 4 :(得分:0)

在Kotlin 1.4中,他们介绍了sumOf的用法:

val bigDecimals: List<BigDecimal> = ...
val sum = bigDecimals.sumOf { it }

documentation