6

I need a real life example when we can use this. I have gone through this link (https://kotlinlang.org/docs/reference/inline-functions.html) but not able to find a good example.

rahul khurana
  • 188
  • 1
  • 9
  • 1
    Does this answer your question? [when to use an inline function in Kotlin?](https://stackoverflow.com/questions/44471284/when-to-use-an-inline-function-in-kotlin) – Dmitrii Leonov Jan 01 '20 at 12:18

2 Answers2

10

So let's say we have a higher-order function, which takes another function as a parameter

fun doSomething(block: () -> Unit){

}

the Kotlin compiler will convert this to equivalent Java code which would be,

void doSomething( new Function(){

  void invoke(){
      // the code which you passed in the functional parameter
   }

})

The Kotlin compiler creates an Anonymous Inner Class for the functional parameter you passed and when you call this passed functional parameter the compiler internally calls this invoke() method.

As a result, all functional parameter results in extra object creation and function call which is a performance and memory overhead.

We can avoid this overhead by introducing the inline modifier. When added to a function the function call is skipped and the function code is added at the call site instead.

So let's say we have a simple testing function,

inline fun testing(block : () -> Unit){ 

   println("Inside the testing block")
   block()
   someOtherRandomFunction()

}

and we call this testing function from the main function, like this

fun main(){

   testing{
           println("Passed from the main function")     
   }

}

When the above main function gets compiled, it would look like

fun main(){

   println("Inside the testing block")
   println("Passed from the main function")
   someOtherRandomFunction()

}

As if no testing function ever existed, all the code body from the testing function is simply copy-pasted inside the main function body.

iCantC
  • 2,852
  • 1
  • 19
  • 34
1

For example:

inline fun TextView.onTextChanged(crossinline onTextChangeListener: (String) -> Unit) {
     addTextChangedListener(object: TextWatcher {
         override fun afterTextChanged(editable: Editable) {
              onTextChangeListener(editable.toString())
         }

         ... 
     ) 
} 

So if you're passing a lambda but you don't want to underneath create an anonymous inner class but rather inline the lambda into the call, then you can use inline. If you need to invoke this lambda inside another anonymous object or lambda, you can use crossinline.

EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428