Een inleiding tot Kotlin

Invoering

Sinds Apple de Swift-programmeertaal voor iOS heeft uitgebracht, hebben veel Android-ontwikkelaars een soortgelijke taal gezocht voor Android-ontwikkeling. Als je een van die ontwikkelaars bent, ga je dol zijn op Kotlin, een JVM-taal die opvallend veel op Swift lijkt.

Kotlin is een statisch getypeerde taal, ontwikkeld door JetBrains, waarvan de syntaxis expressiever en beknopter is dan die van Java. Met functies zoals hogere-orde functies, lambda-expressies, operator-overloading, string-sjablonen en meer, heeft Kotlin veel meer te bieden dan Java. Omdat Java en Kotlin zeer interoperabel zijn, kunnen ze samen in hetzelfde project worden gebruikt.

Als je een bekwaam programmeur bent op Java, kun je Kotlin in een zeer korte tijd leren. In deze tutorial laat ik je zien hoe je de meest gebruikte constructies van Kotlin gebruikt.

voorwaarden

Om met mij mee te gaan, hebt u nodig:

  • een goed begrip van Java.
  • de nieuwste versie van de Kotlin-compiler. Je kunt ook de online speeltuin gebruiken.

1. Klassen

Om een ​​klasse in Kotlin te maken, moet je de klasse trefwoord. Hier ziet u bijvoorbeeld hoe u een lege klasse maakt met de naam Persoon:

"java class Person

"

Eigenschappen toevoegen

Een klasse heeft meestal eigenschappen en lidfuncties (ook methoden genoemd). Laten we twee eigenschappen toevoegen aan de Persoon klasse, naam van type Draad en leeftijd van type Int.

java var name: String = "" var age: Int = 0

Zoals u ziet, is de syntaxis voor het maken van variabelen enigszins anders dan die voor Java. Om een ​​variabele in Kotlin te maken, moet u de var trefwoord. Als u echter wilt dat uw variabele een alleen-lezen / assign-once-variabele is, gebruikt u de val sleutelwoord in plaats daarvan.

Omwille van de nulveiligheid maakt Kotlin ook een onderscheid tussen variabelen die kunnen zijn nul en variabelen die nooit kunnen zijn nul. In ons vorige voorbeeld, beide variabelen naam en leeftijd kan nooit zijn nul. Als ze null zijn, geeft de compiler een foutmelding.

Een variabele maken die kan worden vastgehouden nul, je moet een toevoegen ? naar het type van de variabele. Bijvoorbeeld:

java var college: String? = null

Nu we een klasse hebben, is het eenvoudig om er een instantie van te maken:

java var jake = Persoon ()

Nee, Kotlin heeft de nieuwe trefwoord. Nadat de instantie is gemaakt, hebt u toegang tot de eigenschappen op dezelfde manier als in Java:

java jake.name = "Jake Hill" jake.age = 24 jake.college = "Stephen's College"

Constructors gebruiken

Het initialiseren van de individuele eigenschappen van onze instantie zoals we dat net deden, is geen goede codeermethode. Een betere manier om dit te doen zou zijn door een constructor te gebruiken. De syntaxis van Kotlin om zo'n constructor te maken is erg compact:

"java class Person (var name: String, var age: Int, var college: String?)

"

Als je niets anders aan je klas kunt toevoegen, heb je de accolades niet nodig. De volgende code werkt prima:

"java class Person (var naam: String, var leeftijd: Int, var college: String?)

var jake = Person ("Jake Hill", 24, "Stephen's College") "

Het is misschien al voor de hand liggend dat er geen manier is om aangepaste code aan deze constructor toe te voegen. Deze constructor, die deel uitmaakt van de kop van de klasse, wordt de primaire constructor genoemd.

Om meer constructors aan uw klasse toe te voegen, bekend als secundaire constructors, moet u de bouwer trefwoord. Secundaire constructeurs moeten delegeren naar de primaire constructor met behulp van de deze trefwoord. Laten we een secundaire constructor toevoegen aan onze klasse die de waarde van een eigenschap met de naam initialiseert e-mail:

"java class Person (var name: String, var age: Int, var college: String?)

var email: String = "" constructor (naam: String, leeftijd: Int, college: String ?, email: String): this (name, age, college) this.email = email "

Als u een exemplaar wilt maken met de secundaire constructor, schrijft u zoiets als dit:

java var jake = Person ("Jake Hill", 24, "Stephen's College", "[email protected]")

Ledenfuncties toevoegen

In Kotlin worden functies gemaakt met behulp van de pret trefwoord. Laten we een eenvoudige lidfunctie toevoegen met de naam isEligibleToVote dat levert a op Boolean waarde:

"java fun isLittableToVote (): Boolean // Als de leeftijd groter is dan of gelijk is aan 18 // return true

terugkeer leeftijd> = 18 "

Merk op dat het type van de retourwaarde aan het einde van de functiekop wordt vermeld. Je kunt deze methode op dezelfde manier noemen als in Java:

java jake.isEligibleToVote ()

Extensies maken

Met Kotlin kun je een klasse uitbreiden door er extra functies aan toe te voegen zonder de oorspronkelijke definitie te wijzigen. Dergelijke functies worden extensies genoemd. De namen van deze functies moeten worden voorafgegaan door de namen van de klassen die ze uitbreiden.

Bijvoorbeeld om een ​​extensie toe te voegen met de naam isTeenager naar de Persoon klasse, schrijf je de volgende code buiten de klas:

"java fun Person.isTeenager (): Boolean

// Als de leeftijd binnen het bereik valt // 13-19 retourneert de werkelijke terugkeerleeftijd in 13 ... 19 "

Deze functie is vooral handig wanneer u klassen wilt uitbreiden die niet tot de codebasis van uw project behoren. Het volgende codefragment voegt bijvoorbeeld een extensie toe containsSpaces naar de Draad klasse:

java fun String.containsSpaces (): Boolean return this.indexOf ("")! = - 1

Afgeleide klassen maken

Het is belangrijk om het volgende in gedachten te houden bij het maken van een afgeleide klasse:

  • U moet a gebruiken : in plaats van Java's strekt trefwoord.
  • De header van de basisklasse moet de Open aantekening.
  • Als uw basisklasse een constructor heeft die parameters opneemt, moet uw afgeleide klasse die parameters in de kop zelf initialiseren.

Laten we een klasse met de naam maken werknemer dat is afgeleid van Persoon:

"java open class Persoon (var naam: String, var leeftijd: Int, var college: String?) ...

class Werknemer (naam: String, leeftijd: Int, college: String ?, var company: String): Person (name, age, college)

"

Functies van het lid opheffen

In Kotlin moet je expliciet stellen dat een ledenfunctie kan worden opgeheven door de Open annotatie in de kop van de methode in de basisklasse. In de afgeleide klasse kunnen open functies worden overbrugd met behulp van de override aantekening.

Bijvoorbeeld om het te negeren isEligibleToVote methode, voegt u het volgende codefragment toe aan de werknemer klasse:

java override fun isUligibleToVote (): Boolean // Altijd true return true retourneren

Statische methoden maken

Kotlin staat niet toe dat u statische methoden maakt. Het staat u echter wel toe om pakketniveau-functies te maken die niet tot een klasse behoren.

De hoofd methode is misschien wel de bekendste statische methode. Als u het wilt toevoegen hoofd methode om een ​​pakket genoemd com.tutsplus.code.tutorial, dan zou je code er zo uit zien:

"java package com.tutsplus.code.tutorial

fun main (args: Array)

"

2. Functies

U hebt in de voorgaande voorbeelden al geleerd hoe u eenvoudige functies kunt maken. De syntaxis die u gebruikte om deze functies aan te maken, leek erg op die van Java. Kotlin laat je echter veel meer doen met functies.

Single Expression Functions creëren

Als een functie de waarde van een enkele expressie retourneert, kunt u de = operator na de functiekop, gevolgd door de uitdrukking om de functie te definiëren.

Bijvoorbeeld om een ​​methode toe te voegen aan de Persoon klasse die terugkeert waar als de persoon een tachtigjarige is, zou je schrijven:

java fun isOctogenarian (): Boolean = leeftijd in 80 ... 89

Zoals u kunt zien, is deze korte syntaxis compacter en leesbaarder.

Hogere ordefuncties en Lambda-expressies

Hogere-orde-functies zijn functies die functies kunnen retourneren of functies als parameters kunnen accepteren. Een lambda-uitdrukking daarentegen is slechts een functie zonder naam. Meestal worden lambda-expressies en functies van hogere orde samen gebruikt.

Beschouw het volgende voorbeeld dat de syntaxis van een lambda-expressie laat zien:

java x, y -> x + y

Dit is een eenvoudige lambda-uitdrukking die twee parameters in beslag neemt, X en Y, en geeft hun som terug. Zoals u misschien al geraden had, worden de parameters van de functie vermeld vóór de -> operator en de hoofdtekst van de functie begint na de -> operator. Deze lambda-uitdrukking kan aan een variabele worden toegewezen en als volgt worden gebruikt:

java val sumLambda: (Int, Int) -> Int = x, y -> x + y val actualSum = sumLambda (3,4)

Merk op dat het type variabele dat de lambda-uitdrukking bevat, de soorten parameters en de geretourneerde waarde specificeert.

Het creëren van een functie van hogere orde die bovenstaande lambda-uitdrukking als een parameter kan accepteren, is net zo eenvoudig. Als u bijvoorbeeld een functie wilt maken die het resultaat van de lambda-expressie verdubbelt, schrijft u:

java fun doubleTheResult (x: Int, y: Int, f: (Int, Int) -> Int): Int return f (x, y) * 2

U kunt deze functie als volgt oproepen:

java val result1 = doubleTheResult (3, 4, sumLambda)

Als alternatief kunt u de lambda-uitdrukking direct doorgeven aan de functie van de hogere orde:

java val result2 = doubleTheResult (3, 4, x, y -> x + y)

Lambda-expressies worden vaak gebruikt met arrays. Bekijk bijvoorbeeld de volgende reeks van Int waarden:

java val nummers: Array = arrayOf (1, 2, 3, 4, 5)

Als u de waarde van elk item in de array wilt verdelen, kunt u de kaart functioneer samen met een lambda-uitdrukking als volgt:

"java val squaredNumbers = numbers.map (x -> x * x)

// Het resultaat zal een nieuwe array zijn die // 1, 4, 9, 16, 25 "bevat

3. Bereiken

Range expressies worden heel vaak gebruikt in Kotlin. Je hebt ze al gebruikt tijdens het maken van de isTeenager en isOctogenarian methoden.

Om een ​​bereik te maken, is alles wat u nodig heeft de ... operator.

"java val r1 = 1 ... 5

// Dit bereik bevat het nummer 1, 2, 3, 4, 5 "

Als u een bereik in aflopende volgorde wilt maken, gebruikt u de downto functioneer in plaats daarvan.

"java val r2 = 5 downTo 1

// Dit bereik bevat het nummer 5, 4, 3, 2, 1 "

Als je niet wilt dat de stap is 1, u kunt een aangepaste waarde opgeven met behulp van de stap functie.

"java val r3 = 5 downTo 1 stap 2

// Dit bereik bevat het nummer 5, 3, 1 "

Later in deze zelfstudie ziet u meer bereikuitdrukkingen.

4. Voorwaardelijke constructies

als

In Kotlin, als is een expressie die verschillende waarden retourneert, afhankelijk van of aan de voorwaarde is voldaan. Het volgende voorbeeld illustreert hoe dit werkt.

"java var age = 20 val isUligibleToVote = if (leeftijd> 18)" Ja "anders" Nee "

// isEligibleToVote is nu ingesteld op "Ja" "

wanneer

De wanneer expressie komt overeen met die van Java schakelaar. Het is echter veel veelzijdiger. Neem bijvoorbeeld het volgende voorbeeld.

"java val age = 17

val typeOfPerson = wanneer (leeftijd) 0 -> "Nieuw geboren" in 1 ... 12 -> "Kind" in 13 ... 19 -> "Tiener" anders -> "Volwassene"

// typeOfPerson wordt nu ingesteld op "Tiener" "

Zoals je kunt zien, wanneer kan niet alleen enkele waarden aannemen, maar ook uitdrukkingen als zijn voorwaarden.

5. Constructen in een lus

voor in

In Kotlin kunt u de voor in lus om door arrays, verzamelingen en al het andere dat een iterator biedt te doorlopen. De syntaxis is bijna identiek aan die van Java, behalve het gebruik van de in operator in plaats van Java's : operator. In het volgende voorbeeld ziet u hoe u een reeks van doorloopt Draad voorwerpen.

"java val names = arrayOf (" Jake "," Jill "," Ashley "," Bill ")

voor (naam in namen) println (name) "

Met behulp van bereikuitdrukkingen kunt u ervoor zorgen dat deze lus zich als een traditionele C-stijl gedraagt, voor lus.

"java voor (i in 0 ... 9) println (i)

// Gedraagt ​​zich precies zoals // voor (int i = 0; i<10;i++)"

terwijl en doen terwijl

De syntaxis van terwijl en doen terwijl loops in Kotlin is identiek aan de syntaxis die in Java wordt gebruikt. De volgende Kotlin-code wordt bijvoorbeeld door een array van herhaald Draad objecten met een terwijl lus:

"java val names = arrayOf (" Jake "," Jill "," Ashley "," Bill ") var i = names.size ()

while (i> 0) println (names [-i]) "

6. String-sjablonen

Met Kotlin kunt u variabelen en uitdrukkingen in tekenreeksen insluiten door ze in een paar accolades te wikkelen, voorafgegaan door een $ symbool. Bijvoorbeeld:

"java val name =" Bob "println (" Mijn naam is $ name ") // Prints" Mijn naam is Bob "

val a = 10 val b = 20 println ("De som is $ a + b") // Afdrukken "De som is 30" "

Conclusie

In deze zelfstudie leer je de basisprincipes van de Kotlin-programmeertaal. Hoewel we hier verschillende constructies hebben behandeld, heeft Kotlin veel meer te bieden. Vanaf juni 2015 is Kotlin nog steeds alleen beschikbaar als een voorbeeld. In de komende maanden zullen er waarschijnlijk verschillende verbeteringen en nieuwe functies worden weergegeven.

Als u wilt weten hoe Kotlin in Android Studio moet worden gebruikt, kijk dan eens naar Hoe Kotlin te gebruiken in uw Android-projecten. Voor meer informatie over de Kotlin-taal, raad ik aan de Kotlin-documentatie te bezoeken.