Bottcamp Kotlin per programmatori 2: nozioni di base su Kotlin

Questo codelab fa parte del Kotlin Bootcamp for Programs. Otterrai il massimo valore da questo corso se lavori in sequenza nei codelab. A seconda delle tue conoscenze, potresti essere in grado di scorrere alcune sezioni. Questo corso è rivolto ai programmatori che conoscono una lingua orientata agli oggetti e vogliono imparare il kotlin.

Introduzione

In questo codelab, scoprirai le nozioni di base del linguaggio di programmazione Kotlin: tipi di dati, operatori, variabili, strutture di controllo e variabili nulli e non nulli. Questo corso è rivolto ai programmatori che conoscono una lingua incentrata sugli oggetti e che vogliono imparare il Kotlin.

Anziché creare un'unica app di esempio, le lezioni di questo corso sono state concepite per sviluppare le tue conoscenze, ma sono semi-indipendenti gli uni dagli altri per esplorare le sezioni che conosci. Per collegare tutti questi esempi, molti sono basati su un acquario. E se vuoi vedere l'intera storia dell'acquario, dai un'occhiata al Bootcamp Kotlin per programmatoriCorso Udacity.

Informazioni importanti

  • Come creare un progetto in IntelliJ IDEA
  • Come aprire ed eseguire il codice in REPL (Read-Eval-Print Loop) di Kotlin in IntelliJ IDEA (Tools > Kotlin > Kotlin REPL)

Obiettivi didattici

  • Come utilizzare tipi di dati, operatori e variabili di Kotlin
  • Come utilizzare valori booleani e condizioni
  • La differenza tra variabili nulli e non null
  • Come funzionano gli array, gli elenchi e i loop in Kotlin

In questo lab proverai a:

  • Collabora con il Kotlin REPL per apprendere le nozioni di base di Kotlin

In questa attività imparerai gli operatori e i tipi di linguaggio del programma Kotlin.

Passaggio 1: esplora gli operatori numerici

  1. Apri IntelliJ IDEA, se non è già aperto.
  2. Per aprire il Kotlin REPL, seleziona Tools > Kotlin > Kotlin REPL.

Come per le altre lingue, Kotlin utilizza +, -, * e / per più, meno, tempi e divisione. Kotlin supporta anche diversi tipi di numeri, come Int, Long, Double e Float.

  1. Inserisci le seguenti espressioni nel REPL. Per visualizzare il risultato, premi Control+Enter (Command+Enter su un Mac) dopo ogni aggiornamento.
1+1
⇒ res8: kotlin.Int = 2

53-3
⇒ res9: kotlin.Int = 50

50/10
⇒ res10: kotlin.Int = 5

1.0/2.0
⇒ res11: kotlin.Double = 0.5

2.0*3.5
⇒ res12: kotlin.Double = 7.0

Tieni presente che i risultati delle operazioni mantengono i tipi di operandi, quindi 1/2 = 0, ma 1,0/2,0 = 0,5.

  1. Prova alcune espressioni con diverse combinazioni di numeri interi e decimali.
6*50
⇒ res13: kotlin.Int = 300

6.0*50.0
⇒ res14: kotlin.Double = 300.0

6.0*50
⇒ res15: kotlin.Double = 300.0
  1. Alcuni metodi sui numeri. Kotlin mantiene i numeri come primitivi, ma consente di chiamare i metodi come numeri, come se fossero oggetti.
2.times(3)
⇒ res5: kotlin.Int = 6

3.5.plus(4)
⇒ res8: kotlin.Double = 7.5

2.4.div(2)
⇒ res9: kotlin.Double = 1.2

Passaggio 2: fai pratica con i tipi

Kotlin non esegue la conversione implicitamente tra i tipi di numeri, quindi non puoi assegnare un valore breve direttamente a una variabile lunga o un Byte a un Int. Questo perché la conversione del numero implicito è una fonte comune di errori nei programmi. Puoi sempre assegnare valori di tipi diversi trasmettendoli.

  1. Per vedere alcuni cast possibili, definisci una variabile di tipo Int nel REPL.
val i: Int = 6
  1. Crea una nuova variabile, poi inserisci il nome della variabile mostrato sopra, seguito da .to.
val b1 = i.to

IntelliJ IDEA mostra un elenco di possibili completamenti. Questo completamento automatico funziona per variabili e oggetti di qualsiasi tipo.

  1. Seleziona toByte() dall'elenco, quindi stampa la variabile.
val b1 = i.toByte()
println(b1)
⇒ 6
  1. Assegna un valore Byte a variabili di diverso tipo.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1

val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected

val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected

val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected
  1. Per i compiti che hanno restituito errori, prova a trasmetterli.
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1

val i5: String = b2.toString()
println(i5)
⇒ 1

val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0
  1. Per rendere le costanti numeriche più lunghe e leggibili, Kotlin ti consente di inserire trattini bassi nei numeri, dove ha senso per te. Prova a inserire costanti numeriche diverse.
val oneMillion = 1_000_000
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010

Passaggio 3: scopri il valore dei tipi di variabili

Kotlin supporta due tipi di variabili: modificabili e non modificabili. Con val, puoi assegnare un valore una sola volta. Se tenti di assegnare di nuovo qualcosa, verrà visualizzato un errore. Con var, puoi assegnare un valore e modificarlo in un secondo momento nel programma.

  1. Definisci le variabili utilizzando val e var, quindi assegna loro nuovi valori.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned

Puoi assegnare un valore a fish, quindi assegnargli un nuovo valore, perché è definito con var. Tentativo di assegnare un nuovo valore a aquarium restituisce un errore perché è definito con val.

Il tipo memorizzato in una variabile viene dedotto quando il compilatore può determinarla nel contesto. Se vuoi, puoi sempre specificare esplicitamente il tipo di variabile, utilizzando la notazione dei due punti.

  1. Definisci alcune variabili e specifica il tipo in modo esplicito.
var fish: Int = 12
var lakes: Double = 2.5

Dopo che il tipo è stato assegnato da te o dal compilatore, non puoi modificarlo, altrimenti viene visualizzato un errore.

Passaggio 4: scopri di più sulle stringhe

Le stringhe in Kotlin funzionano come le stringhe in qualsiasi altro linguaggio di programmazione utilizzando " per le stringhe e ' per i singoli caratteri; puoi inoltre concatenare le stringhe con l'operatore +. Puoi creare modelli di stringa combinandoli con valori; il nome $variable viene sostituito con il testo che rappresenta il valore. Questa operazione viene chiamata interpolazione variabile.

  1. Crea un modello di stringa.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
  1. Crea un modello di stringa contenente un'espressione. Come in altre lingue, il valore può essere il risultato di un'espressione. Utilizza le parentesi graffe {} per definire l'espressione.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants

In questa attività imparerai i valori booleani e il controllo delle condizioni nel linguaggio di programmazione Kotlin. Come altri linguaggi, Kotlin dispone di valori booleani e operatori booleani come "minore di", uguale a, maggiore di e così via (<, ==, >, !=, <=, >=).

  1. Scrivi un'istruzione if/else.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
    println("Good ratio!") 
} else {
    println("Unhealthy ratio")
}
⇒ Good ratio!
  1. Prova con un intervallo in un'istruzione if. In Kotlin possono essere utilizzati anche gli intervalli compresi nel test.
val fish = 50
if (fish in 1..100) {
    println(fish)
}
⇒ 50
  1. Scrivi un if con più richieste. Per condizioni più complicate, utilizza i valori logici e && e logici o ||. Come per le altre lingue, puoi avere più richieste utilizzando else if.
if (numberOfFish == 0) {
    println("Empty tank")
} else if (numberOfFish < 40) {
    println("Got fish!")
} else {
    println("That's a lot of fish!")
}
⇒ That's a lot of fish!
  1. Prova un'istruzione when. Esiste un modo migliore per scrivere la serie di istruzioni if/else if/else in Kotlin, utilizzando l'istruzione when, che è come l'istruzione switch in altre lingue. Anche le condizioni in un'istruzione when possono utilizzare intervalli.
when (numberOfFish) {
    0  -> println("Empty tank")
    in 1..39 -> println("Got fish!")
    else -> println("That's a lot of fish!")
}
⇒ That's a lot of fish!

In questa attività, verranno messe a confronto le variabili nulle e non nulli. Gli errori di programmazione che coinvolgono elementi sono stati la causa di innumerevoli bug. Kotlin cerca di ridurre i bug introducendo variabili non null.

Passaggio 1: scopri di più sulla nullità

Per impostazione predefinita, le variabili non possono essere null.

  1. Dichiara un Int e assegnagli null.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
  1. Utilizza l'operatore con punto interrogativo ? dopo il tipo per indicare che una variabile può essere nulla. Dichiara un Int? e assegnagli null.
var marbles: Int? = null

In presenza di tipi di dati complessi, ad esempio un elenco:

  • Puoi consentire che gli elementi dell'elenco siano nulli.
  • Puoi consentire l'annullamento della visualizzazione dell'elenco, ma se non è null, i suoi elementi non possono essere vuoti.
  • Puoi consentire che sia l'elenco sia gli elementi siano nulli.

Gli elenchi e alcuni altri tipi di dati complessi verranno trattati in un'attività successiva.

Passaggio 2: scopri di più sulle e gli operatori ?:

Puoi testare null con l'operatore ?, evitando così di dover scrivere molte istruzioni if/else.

  1. Scrivi un codice più lungo per verificare se la variabile fishFoodTreats non è null. Puoi anche diminuire la variabile.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
  1. Ora scrivi lo stile del Kotlin utilizzando l'operatore ?.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
  1. Puoi anche concatenare test nulli con l'operatore ?:. Guarda questo esempio:
fishFoodTreats = fishFoodTreats?.dec() ?: 0

È l'abbreviazione di "se fishFoodTreats non è null, riduci e utilizzalo; altrimenti, utilizza il valore dopo ?:, che è 0." Se fishFoodTreats è null, la valutazione viene interrotta e il metodo dec() non viene chiamato.

Un punto sui puntatori nulli

Se ami NullPointerExceptions, Kotlin te lo consente. L'operatore dell'asserzione non null, !! (bang-bang), converte qualsiasi valore in un tipo non null e genera un'eccezione se il valore è null.

val len = s!!.length   // throws NullPointerException if s is null

In questa attività imparerai gli array e gli elenchi e scoprirai i diversi modi per creare loop nel linguaggio di programmazione Kotlin.

Passaggio 1: crea elenchi

Gli elenchi sono un tipo fondamentale di Kotlin e sono simili agli elenchi di altre lingue.

  1. Dichiara un elenco utilizzando listOf e stampalo. Questo elenco non può essere modificato.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
  1. Dichiara un elenco che può essere modificato utilizzando mutableListOf. Rimuovi un elemento.
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true

Il metodo remove() restituisce true quando l'elemento viene rimosso correttamente.

Passaggio 2: crea gli array

Come altre lingue, il Kotlin ha array. A differenza degli elenchi in Kotlin, che sono versioni modificabili e immutabili, non esiste una versione modificabile di un Array. Una volta creata un array, le sue dimensioni sono fisse. Non puoi aggiungere o rimuovere elementi, tranne copiarli in un nuovo array.

Le regole relative all'utilizzo di val e var sono le stesse per gli array e per gli elenchi.

  1. Dichiara un array di stringhe utilizzando arrayOf. Utilizza l'utilità java.util.Arrays.toString() per stamparla.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
  1. Un array dichiarato con arrayOf non ha un tipo associato agli elementi, quindi puoi mescolare i tipi, funzionalità utili. Dichiara un array con tipi diversi.
val mix = arrayOf("fish", 2)
  1. Puoi anche dichiarare gli array con un solo tipo per tutti gli elementi. Dichiara un array di numeri interi utilizzando intArrayOf(). Sono disponibili builder, o funzioni di creazione di istanze, per array di altri tipi.
val numbers = intArrayOf(1,2,3)
  1. Combina due array con l'operatore +.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
  1. Prova diverse combinazioni di array ed elenchi nidificati. Come in altre lingue, puoi nidificare array ed elenchi. In altre parole, quando inserisci un array all'interno di un array, il risultato è un array di array, non un array dei due contenuti. Gli elementi di un array possono essere anche elenchi, mentre gli elementi di elenchi possono essere array.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)
⇒ [[I@89178b4, [Atlantic, Pacific], salmon]

Il primo elemento, numbers, è un Array. Quando non utilizzi l'utilità array per stamparla, Kotlin stampa l'indirizzo anziché il contenuto dell'array.

  1. Una funzionalità interessante di Kotlin è che puoi inizializzare gli array con il codice invece di inizializzarli su 0. Prova questo esempio:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]

Il codice di inizializzazione è compreso tra parentesi graffe, {}. Nel codice, it fa riferimento all'indice dell'array, che inizia con 0.

Passaggio 3: crea i loop

Ora che disponi di elenchi e array, il loop degli elementi funziona come previsto.

  1. Crea un array. Usa un loop for per iterare l'array e stampare gli elementi.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
    print(element + " ")
}
⇒ shark salmon minnow
  1. In Kotlin puoi impostare il loop degli elementi e degli indici contemporaneamente. Prova questo esempio:
for ((index, element) in school.withIndex()) {
    println("Item at $index is $element\n")
}
⇒ Item at 0 is shark
Item at 1 is salmon
Item at 2 is minnow
  1. Prova dimensioni e intervalli di passaggi diversi. Puoi specificare intervalli alfabetici di numeri o caratteri. E come in altre lingue, non devi fare un passo in avanti di uno. Puoi tornare indietro utilizzando downTo.
for (i in 1..5) print(i)
⇒ 12345

for (i in 5 downTo 1) print(i)
⇒ 54321

for (i in 3..6 step 2) print(i)
⇒ 35

for (i in 'd'..'g') print (i)
⇒ defg
  1. Prova qualche ciclo. Come altre lingue, Kotlin ha while loop, do...while loop e ++ e -- operatori. Kotlin ha anche repeat loop.
var bubbles = 0
while (bubbles < 50) {
    bubbles++
}
println("$bubbles bubbles in the water\n")

do {
    bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")

repeat(2) {
     println("A fish is swimming")
}
⇒ 50 bubbles in the water
49 bubbles in the water
A fish is swimmingA fish is swimming

Kotlin è molto simile ad altre lingue per quanto riguarda le nozioni di base, come gli operatori, gli elenchi e i loop, ma esistono alcune differenze importanti.

In Kotlin le seguenti funzionalità potrebbero essere diverse da quelle che usi per altre lingue:

  • I tipi di Kotlin non possono essere implicitamente convertiti. Utilizza la trasmissione.
  • Le variabili dichiarate con val possono essere assegnate una sola volta.
  • Le variabili Kotlin non sono nulli per impostazione predefinita. Utilizza ? per rendere nulle le variabili.
  • Con Kotlin puoi eseguire il loop dell'indice e degli elementi di un array contemporaneamente in un loop for.

I seguenti costrutti di programmazione Kotlin sono simili a quelli in altre lingue:

  • Gli array e gli elenchi possono avere un solo tipo o tipi misti.
  • È possibile nidificare array ed elenchi.
  • Puoi creare loop con for, while, do/while e repeat.
  • L'istruzione when è la versione Kotlin dell'istruzione switch, ma when è più flessibile.

Documentazione di Kotlin

Se vuoi saperne di più su qualsiasi argomento del corso o se ti blocchi, https://kotlinlang.org è il punto di partenza migliore.

Tutorial su Kotlin

Il sito web https://try.kotlinlang.org include tutorial avanzati chiamati Kotlin Koans, un interprete basato sul Web, e una serie completa di documentazione di riferimento con esempi.

Corso Udacity

Per visualizzare il corso Udacity su questo argomento, consulta il Kotlin Bootcamp for Programrs.

IDA IntelliJ

La documentazione relativa a IntelliJ IDEA è disponibile sul sito web di JetBrains.

In questa sezione sono elencati i possibili compiti per gli studenti che lavorano attraverso questo codelab nell'ambito di un corso tenuto da un insegnante. Spetta all'insegnante fare quanto segue:

  • Assegna i compiti, se necessario.
  • Comunica agli studenti come inviare compiti.
  • Valuta i compiti.

Gli insegnanti possono utilizzare i suggerimenti solo quanto e come vogliono e dovrebbero assegnare i compiti che ritengono appropriati.

Se stai lavorando da solo a questo codelab, puoi utilizzare questi compiti per mettere alla prova le tue conoscenze.

Rispondi a queste domande

Domanda 1

Quale dei seguenti elementi dichiara un elenco di stringhe non modificabili?

val school = arrayOf("shark", "salmon", "minnow")

var school = arrayOf("shark", "salmon", "minnow")

val school = listOf("shark", "salmon", "minnow")

val school = mutableListOf("shark", "salmon", "minnow")

Domanda 2

Quale sarà l'output del seguente codice?
for (i in 3..8 step 2) print(i)

▢: 345678

▢ 468

▢ 38

▢ da 357

Domanda 3

Qual è lo scopo del punto interrogativo in questo codice?
var rocks: Int? = 3

▢ Il tipo di variabile rocks non è fisso.

▢ La variabile rocks può essere impostata su null.

▢ Non è possibile impostare la variabile rocks su null.

▢ La variabile rocks non deve essere inizializzata subito.

Passa alla lezione successiva: 3. Funzioni

Per una panoramica del corso, inclusi i link ad altri codelab, vedi "Kotlin Bootcamp for Programs: Welcome to the Course."