Функция высшего порядка (Higher-Order Function) — это функция, которая:
fun higherOrderFunction(callback: (Int) -> String): String {
val result = 42
return callback(result)
}
Проблема: Обработка асинхронных результатов
Решение:
fun fetchData(callback: (Result<Data>) -> Unit) {
thread {
try {
val data = api.getData()
callback(Result.success(data))
} catch (e: Exception) {
callback(Result.failure(e))
}
}
}
// Использование
fetchData { result ->
when (result) {
is Success -> showData(result.data)
is Failure -> showError(result.exception)
}
}
Пример: Кастомная фильтрация списка
fun List<Int>.filterCustom(predicate: (Int) -> Boolean): List<Int> {
val result = mutableListOf<Int>()
for (item in this) {
if (predicate(item)) {
result.add(item)
}
}
return result
}
// Использование
val numbers = listOf(1, 2, 3, 4, 5)
val evens = numbers.filterCustom { it % 2 == 0 }
Паттерн "Стратегия":
fun processPayment(
amount: Double,
strategy: (Double) -> Boolean
): Boolean {
return strategy(amount)
}
// Стратегии
val creditCardStrategy = { amount: Double ->
/* логика оплаты картой */ true
}
val cryptoStrategy = { amount: Double ->
/* логика крипто-оплаты */ true
}
// Использование
processPayment(100.0, creditCardStrategy)
Пример:
fun dialog(init: DialogBuilder.() -> Unit): Dialog {
val builder = DialogBuilder()
builder.init()
return builder.build()
}
// Использование
dialog {
title = "Warning"
message = "Are you sure?"
positiveButton("Yes") { /* action */ }
negativeButton("No") { /* action */ }
}
fun <A, B, C> compose(f: (B) -> C, g: (A) -> B): (A) -> C {
return { x -> f(g(x)) }
}
val square = { x: Int -> x * x }
val double = { x: Int -> x * 2 }
val squareThenDouble = compose(double, square)
fun <T, R> ((T) -> R).memoize(): (T) -> R {
val cache = mutableMapOf<T, R>()
return { input -> cache.getOrPut(input) { this(input) } }
}
val expensiveCalculation = { x: Int ->
Thread.sleep(1000)
x * x
}.memoize()
inline fun measureTime(block: () -> Unit): Long {
val start = System.nanoTime()
block()
return System.nanoTime() - start
}
Плюсы:
функции высшего порядка — мощный инструмент для создания гибкого и переиспользуемого кода. Они особенно полезны для обработки асинхронных операций, реализации паттернов проектирования и построения DSL. Однако требуют взвешенного подхода к применению, особенно в performance-critical участках кода.