Sobes.tech
Junior

Jakie funkcje zakresu w Kotlinie znasz?

sobes.tech AI

Odpowiedź od AI

  • let: Wykonuje blok kodu na obiekcie i zwraca wynik ostatniego wyrażenia. Często używany do bezpiecznego wywoływania metod na nullable obiektach.
  • run: Ma dwie warianty:
    • Jako funkcja rozszerzenia: Wykonuje blok kodu na obiekcie (this) i zwraca wynik ostatniego wyrażenia.
    • Jako funkcja samodzielna: Wykonuje blok kodu bez odbiorcy i zwraca wynik ostatniego wyrażenia.
  • with: Wykonuje blok kodu na obiekcie-receptorze podanym jako argument i zwraca wynik ostatniego wyrażenia.
  • apply: Wykonuje blok kodu na obiekcie (this) i zwraca sam obiekt. Często używany do konfiguracji właściwości obiektu.
  • also: Wykonuje blok kodu na obiekcie (it) i zwraca sam obiekt. Używany do wykonywania działań ubocznych na obiekcie.
// Przykład użycia let
val name: String? = "Kotlin"
val length = name?.let {
    // this == null
    // it == "Kotlin"
    it.length // Zwraca długość łańcucha
} // length == 6

// Przykład użycia run jako rozszerzenia
val numbers = mutableListOf(1, 2, 3)
val firstAndLast = numbers.run {
    listOf(first(), last())
    // this == numbers
} // firstAndLast == [1, 3]

// Przykład użycia run jako funkcji samodzielnej
val result = run {
    // Bez odbiorcy
    println("Uruchamianie bloku")
    1 + 2 // Zwraca 3
} // result == 3

// Przykład użycia with
val configuration = configureUsing {
    // this - obiekt przekazany do configureUsing
    width = 100
    height = 200
}

fun configureUsing(builder: ScopeExample.() -> Unit): ScopeExample {
    val example = ScopeExample()
    example.builder()
    return example
}

class ScopeExample {
    var width: Int = 0
    var height: Int = 0
}

// Przykład użycia apply
val person = mutableListOf<String>().apply {
    // this == lista
    add("Alice")
    add("Bob")
} // person == ["Alice", "Bob"]

// Przykład użycia also
val list = mutableListOf(1, 2, 3)
val doubledList = list.also {
    // it == lista
    println("Przetwarzanie listy: $it")
}.map { it * 2 } // doubledList == [2, 4, 6]