我有一个我要过滤的列表,然后返回一个带有金额总和的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有办法吗?
答案 0 :(得分:14)
就像您在java中使用Collectors.reducing
一样,您可以在Kotlin中使用fold
或reduce
扩展函数:
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)
如果列表可以为空,则您需要fold
和BigDecimal.ZERO
,就像接受的答案所建议的那样。
答案 4 :(得分:0)
在Kotlin 1.4中,他们介绍了sumOf
的用法:
val bigDecimals: List<BigDecimal> = ...
val sum = bigDecimals.sumOf { it }