Избегайте подсчета значений Ints с для l oop in Kotlin - PullRequest
0 голосов
/ 27 января 2020

У меня есть список объектов класса A

data class A{
  val abc: Abc
  val values: Int?
}

val list = List<A>

Если я хочу подсчитать, сколько объектов в моем списке я использую: val count= a.count() или val count= a.count(it -> {})

Как добавить все значения в список объектов A избегая для l oop? В общем, я ищу правильный синтаксис kotlin, избегая кода ниже

if (a!= null) {
  for (i in list) {
    counter += i.values!!
  }
}

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Либо используйте sumBy, либо sum на тот случай, если у вас уже есть список номеров, которые можно не обнулять, например:

val counter = list.sumBy { it.values ?: 0 }
// or
val counter = extractedNonNullValues.sum()

последнее имеет смысл, только если вы уже сопоставили свой A.values ранее со списком ненулевых значений, например что-то вроде:

val extractedNonNullValues= list.mapNotNull { it.values } // set somewhere else before because you needed it...

Если вам не нужен такой промежуточный список extractedNonNullValues, тогда просто go для sumBy -варианта.

1 голос
/ 27 января 2020

Я не вижу, чтобы вы добавляли список в вопросе. Основываясь на вашем для l oop Я считаю, что вы имели в виду "Как мне суммировать свойства объектов в моем списке". В этом случае вы можете использовать sumBy, функцию расширения в списке, которая принимает labmda: ((T) -> Int) и возвращает Int примерно так:

val sum = list.sumBy { a -> a.values ?: 0 }

Также, вызывая свойство Int values довольно запутанно, я думаю, что это должно называться value. Множественное число указывает на список ...

С другой стороны, в вашем оригинале возможно значение NPE для l oop. Избегайте использования !! для значений Nullable, так как, если значение равно NULL, вы получите NPE. Вместо этого используйте оператор null coalescing (aka elvis), чтобы вернуться к значению по умолчанию ?: - это совершенно приемлемо в функции суммы. Если итерация не связана с суммированием, вам, возможно, придется по-разному обрабатывать нулевой регистр.

...