Что такое сгиб Kotlin, который позволяет мне поставить функцию операции после закрывающих скобок? - PullRequest
0 голосов
/ 24 февраля 2020

Что такое Iterable.fold(...) в Kotlin, что позволяет мне поставить operation функцию после закрывающих скобок?

val numbers = listOf(5, 2, 10, 4)

// operation function passed as the second param of fold
val sumDoubled1 = numbers.fold(0, { sum, n -> sum + n * 2 })
println(sumDoubled1)

// operation function after the closing paren of fold
val sumDoubled2 = numbers.fold(0) { sum, n -> sum + n * 2 }
println(sumDoubled2)

Ответы [ 2 ]

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

В дополнение к ответу Павнеета, обоснование этого заключается в том, что он позволяет писать то, что выглядит как расширение языка. Например:

repeat (10) {
    // Do something
}

Это похоже на новый тип структуры l oop; но на самом деле это просто функция с именем repeat(), которая принимает два параметра; целое число и лямбда.

Кроме того, если лямбда является параметром only , вы можете полностью опустить парены, например:

repeatForever {
    // Do something
}

(repeat() находится в стандартной библиотеке; repeatForever() оставлено в качестве упражнения для читателя: -)

Возможность обрабатывать некоторые встроенные вызовы методов, такие как someValue.takeIf{ it > 0 }, является просто приятным побочным эффектом этого .

1 голос
/ 24 февраля 2020

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

fun main() {
    processInput("Lambda", { println(it) })
    processInput("Passing trailing lambda") { println(it) }
    processInput("Passing trailing lambda with named param") { input -> println(input) }
}

fun processInput(input:String, method:(str:String)->Unit){
    method(input.toUpperCase()) // additional logic
}

Вывод:

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