Vous pouvez utiliser Iterable<T>.sumBy
:
/**
* Returns the sum of all values produced by [selector] function applied to each element in the collection.
*/
public inline fun <T> Iterable<T>.sumBy(selector: (T) -> Int): Int {
var sum: Int = 0
for (element in this) {
sum += selector(element)
}
return sum
}
Vous pouvez passer une fonction à elle où la fonction transforme la valeur négative à 0. Ainsi, il résume toutes les valeurs dans la liste qui est supérieure à 0 puisque l'ajout de 0 n'a aucun effet sur le résultat.
val nums = listOf<Long>(-2, -1, 1, 2, 3, 4)
val sum = nums.sumBy { if (it > 0) it.toInt() else 0 }
println(sum) //10
Si vous avez besoin d'une valeur Long
retour, vous devez écrire une extension pour Long
comme Iterable<T>.sumByDouble
. La conversion toInt()
peut être supprimée.
nums.sumByLong { if (it > 0) it else 0 }
Comme suggéré par @Ruckus T-Boom, if (it > 0) it else 0
peut être simplifiée en utilisant Long.coerceAtLeast()
qui renvoie la valeur elle-même ou la valeur minimale donnée:
nums.sumByLong { it.coerceAtLeast(0) }
Vous pouvez utiliser 'it.coerceAtLeast (0)' au lieu de 'if (it> 0) c'est autre 0' –