# How to run, let, also, apply in Kotlin

A short summary on Kotlin standard library functions: run, let, also, apply

If you decide to write Kotlin code, eventually you will see a lot of usage of the following 4 functions from standard library: run, let, also and apply.

After doing a lot of research, I show simple examples of how to use them here.

First, a helper class Student.

class Student(name: String, age: Int, stuNum: String) {

var name = name
private set

var age = age
private set

var stuNum = stuNum
private set

fun increaseAge() {
age++
}

fun nameToUpperCase() {
name = name.toUpperCase()
}

override fun toString(): String {
return "($name,$age, \$stuNum)"
}
}

We can group the 4 functions into 2 groups: transformation functions and mutation functions.

# Transformation functions

This means that the function takes an A and returns a B.

run and let belongs in this group.

val student = Student("Bob", 19, "1234")

// Takes a student and returns its name, Student -> String

val name = student.run {
println(this)
name
}

val name1 = student.let {
println(it)
it.name
}

# Mutation functions

This means that the function takes an A, mutate its state, and return it back.

apply and also belongs in this group.

val student = Student("Bob", 19, "1234")

val result = student.apply {
increaseAge()
nameToUpperCase()
}

val result1 = student.also {
it.increaseAge()
it.nameToUpperCase()
}

So when trying to choose from these 4 functions, think in terms of transformation and mutation, NOT the four function names (the names are terrible in my opinion).

Another thing is that I cannot figure out when to used which function inside each group, to me they are pretty much interchangable. If someone has a good explanation, please let me know.