В чем основная разница между fold и reduce в Котлине? Когда использовать что? [дубликат]

этот вопрос уже есть ответ здесь:

Я прохожу через основы Котлина, и я довольно смущен этим обеими функциями fold() и reduce() в Котлине, может ли кто-нибудь дать мне конкретный пример, который отличает их обоих?

1 ответов


fold принимает начальное значение, и первый вызов лямбды, который вы передаете ему, получит это начальное значение и первый элемент коллекции в качестве параметров.

например, возьмите следующий код, который вычисляет сумму списка целых чисел:

listOf(1, 2, 3).fold(0) { sum, element -> sum + element }

первый вызов лямбда будет с параметрами 0 и 1.

наличие возможности передать начальное значение полезно, если у вас есть чтобы предоставить какое-то значение или параметр по умолчанию для вашей операции. Например, если вы искали максимальное значение внутри списка, но по какой-то причине хотите вернуть хотя бы 10, вы можете сделать следующее:

listOf(1, 6, 4).fold(10) { max, element ->
    if (element > max) element else max
}

reduce не принимает начальное значение, а вместо этого начинается с первого элемента коллекции в качестве аккумулятора (называется sum в следующем примере).

например, давайте сделаем сумму целых чисел опять:

listOf(1, 2, 3).reduce { sum, element -> sum + element }

первый вызов лямбда здесь будет с параметрами 1 и 2.

можно использовать reduce когда ваша операция не зависит от каких-либо значений, отличных от значений в коллекции, к которой Вы ее применяете.