Kotlin functions are first-class
- Can be stored in variables or data structures
- Can be passed as arguments
- Can be returned from higher-order-functions (functions that returns a function)
Functions
Kotlin functions are declared using fun
keyword.
Function parameters are defined name: type
, separated using commas.
fun add(x: Int, y: Int): Int { return x + y }
Kotlin functions can have default arguments
import kotlin.random.Random fun getRandomPercentage(start: Int = 0, end: Int = 100): Int { return Random.nextInt(start, end) } getRandomPercentage() // Random number from 0-100 getRandomPercentage(20,30) // Random number from 20-30 getRandomPercentage(end = 50) // Random number from 0-50
Higher-Order Functions
A function that takes functions as parameters, or returns a function
Here, fold
takes a combine
function which takes params (acc and next num) and returns new acc.
The operations can be anything, as long returning same acc value.
fun <T, R> Collection<T>.fold( initial: R, combine: (acc: R, nextElement: T) -> R ): R { var accumulator: R = initial for (element: T in this) { accumulator = combine(accumulator, element) } return accumulator } val items = listOf(1, 2, 3, 4, 5) items.fold(0, { acc: Int, i: Int -> val result = acc + i result })
Example on projects:
Here I have setupOperatorButton to receive a functions with params (2 doubles) and return String.
Here I only need to pass the calculator functions.
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) val view = binding.root setContentView(view) setupBtnListener() } private fun setupBtnListener() { setupOperatorButton(binding.plusBtn) { a, b -> Calculator.add(a, b) } setupOperatorButton(binding.minBtn) { a, b -> Calculator.subtract(a, b) } setupOperatorButton(binding.mulBtn) { a, b -> Calculator.multiply(a, b) } setupOperatorButton(binding.divBtn) { a, b -> Calculator.divide(a, b) } } private fun setupOperatorButton(button: View, operation: (Double, Double) -> String) { button.setOnClickListener { val a = binding.numberOneEt.text.toString().toDoubleOrNull() val b = binding.numberTwoEt.text.toString().toDoubleOrNull() val result = operation(a, b) binding.resultTv.text = result } } }
object Calculator { fun add(a: Double, b: Double): String { val result = a + b return result.toString() } fun subtract(a: Double, b: Double): String { val result = a - b return result.toString() } fun multiply(a: Double, b: Double): String { val result = a * b return result.toString() } fun divide(a: Double, b: Double): String { if (b == 0.0) return "NaN" // or handle division by zero separately val result = a / b return result.toString() } }
Top comments (0)