2017-10-20 40 views
3

est-il un moyen de Kotlin pour faire la sum() opération sur une filtrée liste des numéros, sans filtrage en fait les premiers éléments?un sous-ensemble de nombres dans une liste

Je suis à la recherche de quelque chose comme ceci:

val nums = listOf<Long>(-2, -1, 1, 2, 3, 4) 
val sum = nums.sum(it > 0) 

Répondre

4

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) } 
+2

Vous pouvez utiliser 'it.coerceAtLeast (0)' au lieu de 'if (it> 0) c'est autre 0' –