Есть ли эквивалент суммы для умножения? - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть массив классов со значениями. Например,

class MyData(val value: Double)

class MyClass(val values: List<MyData>)

довольно просто получить сумму всех значений в массиве:

values.sumByDouble { it.value }

Есть ли эквивалент для умножения этих значений внутри этих классов?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Вы можете создать функцию расширения:

public inline fun <T> Iterable<T>.multiplyByDouble(selector: (T) -> Double): Double {
    this.firstOrNull() ?: return 0.0
    var result = 1.0
    for (element in this) {
        result *= selector(element)
    }
    return result
}

и использовать ее:

listOf(2.0, 3.0).multiplyByDouble { it }  // 6.0
listOf<Double>().multiplyByDouble { it }  // 0.0
1 голос
/ 04 февраля 2020

Для этого нет выделенной функции, но вы можете использовать уменьшение для этого. Но существует проблема. Поскольку элемент (в данном случае типа T с S в качестве верхней границы) должен быть подтипом аккумулятора (в данном случае типа S),

inline fun <S, T : S> Iterable<T>.reduce(
    operation: (acc: S, T) -> S
): S

, который в вашем примере это не так, было бы неплохо сначала сопоставить элементы MyData со значением Double:

val l = listOf(MyData(1.0), MyData(2.0), MyData(3.0))
    .map { it.value }
    .reduce { acc, ele -> acc * ele }

println(l) // 6.0

В качестве альтернативы вы можете изменить модель данных (как показано * 1014). * здесь ) но это не может быть хорошей идеей только для умножения всех значений, но это зависит от вашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...