Sumar un subset de numbers en una list

¿Hay alguna manera en Kotlin para hacer la operación sum() en una list filtrada de numbers, sin filtrar primero los elementos?

Estoy buscando algo como esto:

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

Puede hacer uso de 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 } 

Puede pasarle una function donde la function transforma el valor negativo a 0. Entonces, resume todos los valores en la list que son mayores que 0, ya que agregar 0 no tiene efecto en el resultado.

 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 necesita recuperar un valor Long , tiene que escribir una extensión para Long igual que Iterable<T>.sumByDouble .

 inline fun <T> Iterable<T>.sumByLong(selector: (T) -> Long): Long { var sum: Long = 0 for (element in this) { sum += selector(element) } return sum } 

Entonces, la conversión de toInt() se puede quitar.

  nums.sumByLong { if (it > 0) it else 0 } 

Como sugiere @Ruckus T-Boom, if (it > 0) it else 0 se puede simplificar utilizando Long.coerceAtLeast() que devuelve el valor en sí o el valor mínimo dado:

 nums.sumByLong { it.coerceAtLeast(0) } 
  • consultas de múltiples dominios de Android con RXJava
  • Acceder a los ID de resources usando Kotlin y Anko
  • No se puede instalar el gradle para android studio 3.0
  • ¿Cuál es el campo de anotación de Kotlin Equivlant a Java con el tipo de comodín delimitado?
  • Cómo usar Spek
  • ¿Cómo podemos usar Dagger2 con kotlin?
  • NoClassDefFoundError okhttp3.internal.io.FileSystem
  • ¿Por qué unregisterReceiver () nunca llama aServiceDisconnected?
  • Anulando un método varargs Java @Nullable en Kotlin, IDE se queja de que no anula nada
  • ¿Cómo puedo refactorizar una vista para permitir el filtrado de elementos vinculados a un observable ArrayList dentro de una aplicación tornadofx?
  • Kotlin REPL con Android Classes unStub! Ed