Funkcje jednowyrażeniowe

Gdy funkcja sprowadza się do jednego wyrażenia, Kotlin pozwala zapisać ją krócej – bez klamr i return, ze znakiem =. Poznasz ten skrót, zobaczysz, kiedy można pominąć typ zwracany, i dowiesz się, kiedy warto go stosować.

= zamiast { return } inferencja typu krótkie funkcje Lekcja 3.2
1

Czym jest skrócony zapis

Wiele funkcji robi tylko jedną rzecz: liczy wynik z parametrów i go zwraca. Dla takich funkcji pełny zapis z klamrami i return jest niepotrzebnie rozwlekły. Kotlin oferuje wtedy funkcję jednowyrażeniową – krótszy zapis ze znakiem =.

To samo, krócej
// zapis blokowy (z poprzedniej lekcji)
fun kwadrat(x: Int): Int {
    return x * x
}

// zapis jednowyrażeniowy – to samo działanie
fun kwadrat(x: Int) = x * x
2

Składnia: = zamiast { return }

Zamiast klamr i słowa return stawiamy znak = i podajemy jedno wyrażenie. Jego wartość staje się wynikiem funkcji.

ElementZapis blokowyZapis jednowyrażeniowy
Ciałow klamrach { }po znaku =
Zwracaniesłowo returnbrak – wynikiem jest wyrażenie
Liczba instrukcjidowolnadokładnie jedno wyrażenie
Kilka prostych funkcji
fun suma(a: Int, b: Int) = a + b
fun szescian(x: Int) = x * x * x
fun powitanie(imie: String) = "Cześć, $imie!"

fun main() {
    println(suma(3, 5))        // 8
    println(szescian(2))         // 8
    println(powitanie("Anna"))    // Cześć, Anna!
}
3

Pominięcie typu zwracanego

Przy zapisie jednowyrażeniowym Kotlin potrafi sam rozpoznać typ wyniku z wyrażenia po = – tak jak rozpoznawał typ zmiennej z jej wartości. Dlatego typ zwracany zwykle pomijamy.

Typ wywnioskowany automatycznie
fun kwadrat(x: Int) = x * x          // wynik to Int
fun polowa(x: Double) = x / 2         // wynik to Double
fun pelnoletni(wiek: Int) = wiek >= 18   // wynik to Boolean
Czasem warto typ jednak zapisać

Gdy wyrażenie jest złożone i z wyglądu nie widać od razu, co funkcja zwraca, podaj typ jawnie – fun kwadrat(x: Int): Int = x * x. Działa jak dokumentacja i ułatwia czytanie kodu innym.

4

if / when jako ciało funkcji

Pamiętasz, że w Kotlinie if i whenwyrażeniami (mają wartość)? Dzięki temu mogą być całym ciałem funkcji jednowyrażeniowej – to jeden z najwygodniejszych zapisów.

if jako ciało
fun wiekszy(a: Int, b: Int) = if (a > b) a else b

println(wiekszy(5, 8))   // 8
when jako ciało
fun nazwaDnia(n: Int) = when (n) {
    1 -> "Poniedziałek"
    2 -> "Wtorek"
    3 -> "Środa"
    else -> "Inny dzień"
}

println(nazwaDnia(2))   // Wtorek
5

Kiedy stosować

Skrócony zapis to wygoda, ale nie do wszystkiego. Prosta zasada:

SytuacjaZapis
Funkcja to jedno krótkie wyrażeniejednowyrażeniowy =
Funkcja oparta na if/when jako wyrażeniujednowyrażeniowy =
Funkcja ma kilka kroków / zmiennych / pętlęblokowy { ... }
Funkcja tylko coś wypisuje (wiele instrukcji)blokowy { ... }
Nie upychaj wszystkiego w jedną linię

Jeśli żeby zmieścić się w jednym wyrażeniu kod robi się nieczytelny, lepiej wróć do zapisu blokowego. Skrót ma poprawiać czytelność, a nie ją psuć.

6

Częste błędy

❌ Błąd 1: return w funkcji z =

❌ Zbędne return

fun kwadrat(x: Int) = return x * x
// Błąd! po = podajemy
// samo wyrażenie,
// bez return

✅ Tylko wyrażenie

fun kwadrat(x: Int) = x * x

❌ Błąd 2: wiele instrukcji po =

❌ Dwie czynności w skróconej

fun opis(x: Int) =
    println("Liczba:")
    println(x)
// druga linia jest już
// POZA funkcją

✅ Wiele instrukcji = blok

fun opis(x: Int) {
    println("Liczba:")
    println(x)
}

❌ Błąd 3: brak znaku =

❌ Wyrażenie bez =

fun kwadrat(x: Int): Int x * x
// Błąd! potrzebny = albo
// klamry { return ... }

✅ Ze znakiem =

fun kwadrat(x: Int): Int = x * x

❌ Błąd 4: zaskakujący wywnioskowany typ

❌ Spodziewasz się 2.5

fun polowa(x: Int) = x / 2
// polowa(5) -> 2 (Int!)
// dzielenie całkowite

✅ Wymuś Double w wyrażeniu

fun polowa(x: Int) = x / 2.0
// polowa(5) -> 2.5 (Double)
7

Podsumowanie

  • Funkcja jednowyrażeniowa zastępuje { return wyrażenie } zapisem = wyrażenie.
  • Po = podajemy jedno wyrażenie – bez klamr i bez return.
  • Typ zwracany zwykle pomijamy – Kotlin rozpoznaje go z wyrażenia (inferencja).
  • Przy złożonym wyrażeniu warto typ jednak zapisać dla czytelności.
  • if i when (jako wyrażenia) świetnie sprawdzają się jako ciało skróconej funkcji.
  • Wiele instrukcji, pętla lub kilka zmiennych → wróć do zapisu blokowego { ... }.
8

Zadania do wykonania

Zadania wykonaj w Kotlin Playground (play.kotlinlang.org).

Zadanie 1 łatwe

Weź funkcję blokową fun kwadrat(x: Int): Int { return x * x } i przepisz ją na postać jednowyrażeniową.

Zadanie 2 łatwe

Napisz jednowyrażeniowo funkcje: szescian(x) (sześcian liczby) oraz powitanie(imie) (zwraca tekst powitania). Wywołaj obie.

Zadanie 3 łatwe

Napisz jednowyrażeniową funkcję wiekszy(a, b) zwracającą większą z dwóch liczb – wykorzystaj if jako wyrażenie w ciele funkcji.

Zadanie 4 średnie

Napisz jednowyrażeniową funkcję ocenaSlowna(punkty: Int), która na podstawie liczby punktów (0–100) zwraca ocenę słowną – użyj when z zakresami jako ciała funkcji. Przetestuj na kilku wartościach.