В чем основная разница между 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
когда ваша операция не зависит от каких-либо значений, отличных от значений в коллекции, к которой Вы ее применяете.