Несколько функций высшего порядка в kotlin - PullRequest
0 голосов
/ 09 февраля 2020

Можем ли мы передать две функции высшего порядка или более одной в параметр функции? Если так, то как мы будем вызывать ту функцию, которая содержит эти две или более функции высшего порядка в качестве параметра ...

Ответы [ 3 ]

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

Конечно, вы можете. Вы можете иметь любое количество лямбда-параметров, как и для параметров любого другого типа.

Даже стандартная библиотека Kotlins использует это. Например, функция generateSequence.

generateSequence(seedFunction = { 1 }, nextFunction = { it + 1 })

Единственное отличие от не лямбда-параметра заключается в том, что вы можете опустить скобки, если последний параметр вашей функции - лямбда-выражение. Таким образом, вы могли бы назвать generateSequence так же:

generateSequence(seedFunction = { 1 }) { it + 1 }
1 голос
/ 10 февраля 2020

Формулировка

Может быть неправильное понимание того, что такое функция высшего порядка :
GeeksForGeeks :

В Kotlin функция, которая может принимать функцию в качестве параметра или может возвращать функцию, называется функцией высшего порядка.

А теперь определение для функций:

Kotlinlang:

Kotlin функции являются первоклассными, что означает, что они могут храниться в переменных и структурах данных, передаваться в качестве аргументов и возвращаться из других функций более высокого порядка. Вы можете работать с функциями любым способом, который возможен для других нефункциональных значений.

Заключение

Функции могут быть переданы как методы в методы - столько, сколько вам нужно. High-order - это просто (описательный) тип, который означает, что ваш метод либо принимает функции в качестве параметров, либо возвращает функцию.

Пример:

fun <T> takeFiveFunctions(
    block1 : () -> Unit,
    block2 : (T) -> Unit,
    block3 : () -> T,
    block4 : (T) -> T,
    block5 : (List<T>) -> T
) : Boolean = true

fun main() {
    takeFiveFunctions<Int>(
        block1 = { /*do something 1*/ },
        block2 = { print(it) },
        block3 = { 2 },
        block4 = { it * 3 },
        block5 = { it.first() }
    )
}

РЕДАКТИРОВАТЬ

, но другой синтаксис говорит, что мы можем извлечь лямбду из скобок

Котлинланг говорит :

В Kotlin, существует соглашение: если последний параметр функции является функцией, то лямбда-выражение, переданное в качестве соответствующего аргумента, можно поместить за скобки:

Используя мой предыдущий пример, это будет выглядеть так:

fun main() {
    takeFiveFunctions<Int>(
        block1 = { /*do something 1*/ },
        block2 = { print(it) },
        block3 = { 2 },
        block4 = { it * 3 }
    ) { it.first()}
}
0 голосов
/ 09 февраля 2020

Да, почему бы и нет. Вы можете просто сделать это:

fun <T1, T2, T3> Collection<T1>.higherOrder(
  firstFun: (T1)->T2,
  secondFun: (T2)->T3)
: List<T3> {
  return this.map(firstFun).map(secondFun)
}

Вызов:

val result = listOf(3.14, 6.9, 42.0).higherOrder({ it.toInt() }, { it.toString() })
// ["3", "6", "42"]

Kotlin позволяет переместить последний лямбда-параметр за пределы списка параметров, поэтому вы также можете написать:

val result = listOf(3.14, 6.9, 42.0).higherOrder({ it.toInt() }) { it.toString() }

Но в случае нескольких функциональных параметров это плохая практика. Лучшее, что вы можете сделать, это указать имена параметров в явном виде:

val result = listOf(3.14, 6.9, 42.0).higherOrder(
  firstFun = { it.toInt() }, 
  secondFun = { it.toString() }
)

Что гораздо удобнее для чтения.

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