Kotlin lernen – Cheat Sheet Teil 2

In diesem Teil des Kotlin Spickzettels geht es um Funktionen und Klassen in Kotlin. Jede Funktion wird mit fun eingeleitet. Es folgt ein Bezeichner im camelCase. Dahinter in Klammern können Parameter angegeben werden. Der Rückgabewert wird nach den Parametern angegeben

fun nameDerFunktion (wert1: Type) : ReturnType 

Python Entwickler kennen dieses Feature bereits – Java Entwickler werden es lieben – Default Values. Falls ein Parameter nicht angegeben wird wird der Standard Wert verwendet.

package com.robinhenniges.kotlin

import java.util.Random

fun main(args : Array<String>){

    fun welcome(name: String, age : Int = 25) {
    	println("Hello my friend, $name! I guess you are $age years old.")
    }
    
    fun randomNumber() : Int{
        val randNum = Random().nextInt(63)
        return randNum
    }
 
    val ageGuess = randomNumber()
    welcome("Peter", ageGuess)
    welcome("Frank")
}

Result:

Hello my friend, Peter! I guess you are 54 years old.
Hello my friend, Frank! I guess you are 25 years old.

Unit ist das neue Void + String ist anders + filter

In diesem Beispiel könnt ihr 3 Dinge lernen. Zu Beginn schaut euch die den Vergleich der beiden Integer Werte an. Mit dem == Operator wird vergleichen ob der Wert gleich ist. Interessant ist jedoch der === Operator, denn hier wird die Referenz im Speicher verglichen. Somit haben die Variablen first und second nicht die gleiche Referenzen aber den gleichen Wert.

Schaut man weiter sieht man das String hierbei aus der Reihe springt. Das liegt am „string constant pool“ den einige vielleicht schon von Java kennen.

Ein Weiter Punkt ist der Return-Type für Funktionen ohne Return-Type. Dieser ist nicht Void sonderen Unit.

package com.robinhenniges.kotlin

import java.util.Random

fun main(args : Array<String>){
    
    val first = Integer(1337)
    val second = Integer(1337)
    
    println("first == second: ${first == second}")
    println("first === second: ${first === second}")

    fun functionWithVarArg(vararg words: String) : Unit {

        var wordList = words.filter { !it.toLowerCase().equals("fuck")}

        println("Das erste Element beider Listen ist gleich: ${wordList[0] == words[0]}")
        println("""Das erste Element beider Listen hat die gleich Referenz im Speicher: ${wordList[0] === words[0]}""")

       var anotherString = "Frank"
       println("Das Element wordList[0] == anotherString: ${wordList[0] == anotherString}")
       println("Das Element wordList.first() === anotherString: ${wordList.first() === anotherString}")     
        // Hier haben wir erwartet das die Referenz nicht gleich ist. Doch Strings werden von der JVM besonders behandelt
        // Fuer mehr Informationen Google: string constant pool
       
    	wordList.forEach{word -> println(word)}    
    }
    functionWithVarArg("Frank", "Berlin", "FUCK", "Yeah", "Code")
}

Return:

first == second: true
first === second: false
Das erste Element beider Listen ist gleich: true
Das erste Element beider Listen hat die gleich Referenz im Speicher: true
Das Element wordList[0] == anotherString: true
Das Element wordList.first() === anotherString: true
Frank
Berlin
Yeah
Code

Ignore Case equals

words.filter { !it.equals("fuck", true) }

Tail

Rekursion welcome! Tail recursive functions

Recursion wird in Objekt orientierten Sprachen wie Java kaum verwendet da es schnell zu einem StrackOverflow Fehler kommen kann. In Kotlin kann man vor die Funktion den tailrec Modifier schreiben um dieses Problem zu umgehen. Die Funktion wird dann vom Compiler optimiert.

package com.robinhenniges.kotlin

import java.util.Date

fun main(args : Array<String>){
   	val startTime = Date().getTime();
    println(computeFibonacci(45))
    val endTime = Date().getTime();
    println("Computation took ${(endTime-startTime)/1000f} seconds")
}

 tailrec fun computeFibonacci(i : Int) : Int{
    if (i<=0) return 0
    else if(i==1) return 1
    else return computeFibonacci(i-2) + computeFibonacci(i-1)
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.