Kotlin

Kotlin infix functions

What are infix functions?

If you are using Kotlin chances are high you already used infix functions. Maybe without knowing it.

When calling infix functions it is possible to omit the dot and the parentheses. So instead of

1
car.move(forward)

we can write:

1
car move forward

Here are a few examples of commonly used infix functions in Kotlin. The standard call notation (including dot and parentheses) for these functions is shown as comment.

01
02
03
04
05
06
07
08
09
10
11
12
val map = mapOf(
    "foo" to 42     // "foo".to(42)
)
 
for (i in 0 until 5) {  // 0.until(5)
    ...
}
 
val regex = Regex("\\w")
if ("foo" matches regex) {  // "foo".matches(regex)
 
}

Writing your own infix function

Of course we can write our own infix functions.

Infix functions must satisfy the following requirements:

  • They must be member functions or extension functions
  • They must have a single parameter
  • The parameter must not accept variable number of arguments and must have no default value

To create an infix function we have to add the infix keyword to the function signature.

For example:

01
02
03
04
05
06
07
08
09
10
enum class TurnDirection { left, right }
 
class Car {
    infix fun turn(turnDirection: TurnDirection) { ... } // our infix function
}
 
fun main() {
    val car = Car()
    car turn left // infix function call, static import of "left" required   
}

If we return an object that contains an infix function itself, we can chain infix function calls.

For example:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
class TurnDirectionBuilder {
    infix fun then(turnDirection: TurnDirection) { ... }
}
 
class Car {
    infix fun turn(turnDirection: TurnDirection): TurnDirectionBuilder {
        return TurnDirectionBuilder()
    }
}
 
fun main() {
    val car = Car()
    car turn left then right // same as: car.turn(left).then(right)
}

A common example of this in Kotlin is the IntProgression.step() function that might be used in for loops.

For example:

1
for (i in 0 until 10 step 2) { .. }  // same as: 0.until(10).step(2) 

Published on Java Code Geeks with permission by Michael Scharhag, partner at our JCG program. See the original article here: Kotlin infix functions

Opinions expressed by Java Code Geeks contributors are their own.

Michael Scharhag

Michael Scharhag is a Java Developer, Blogger and technology enthusiast. Particularly interested in Java related technologies including Java EE, Spring, Groovy and Grails.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button