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) } 
  • Problema reificado de la class Android Kotlin
  • incapaz de configurar a Kotlin
  • Error " no se puede convertir a JSON" al intentar crear un object JSON de String
  • Casilla de verificación "Incluir soporte de Kotlin" no en Android Studio 3.0 Canary 5
  • Parse 2D Array en Kotlin
  • NoSuchMethodError: no hay método estático beforeCheckcastToFunctionOfArity
  • El escáner Bluetooth Low Energy parece funcionar correctamente pero no encuentra dispositivos
  • ¿Puedo hacer reference a una sobrecarga de function específica?
  • Android ViewModelProviderFactory en kotlin
  • Seleccionar datos de dos tablas en Kotlin Anko
  • ¿Es posible comstackr Kotlin Native sin verificaciones de time de ejecución?