Kotlin Bootcamp for Programmers 2: Kotlin basics

Questo codelab fa parte del corso Kotlin Bootcamp for Programmers. Per ottenere il massimo valore da questo corso, ti consigliamo di seguire le codelab in sequenza. A seconda delle tue conoscenze, potresti riuscire a leggere rapidamente alcune sezioni. Questo corso è rivolto ai programmatori che conoscono un linguaggio orientato agli oggetti e vogliono imparare Kotlin.

Introduzione

In questo codelab imparerai le basi del linguaggio di programmazione Kotlin: tipi di dati, operatori, variabili, strutture di controllo e variabili nullable e non nullable. Questo corso è rivolto ai programmatori che conoscono un linguaggio orientato agli oggetti e vogliono imparare Kotlin.

Anziché creare una singola app di esempio, le lezioni di questo corso sono progettate per sviluppare le tue conoscenze, ma sono semi-indipendenti l'una dall'altra, in modo che tu possa scorrere rapidamente le sezioni che conosci. Per collegarli, molti esempi utilizzano un tema acquatico. Se vuoi scoprire tutta la storia dell'acquario, dai un'occhiata al corso Kotlin Bootcamp for Programmers di Udacity.

Cosa devi già sapere

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

Obiettivi didattici

  • Come utilizzare tipi di dati, operatori e variabili Kotlin
  • Come utilizzare i valori booleani e le condizioni
  • La differenza tra variabili nullable e non nullable
  • Come funzionano array, elenchi e cicli in Kotlin

In questo lab proverai a:

  • Utilizzare Kotlin REPL per imparare le nozioni di base di Kotlin

In questa attività, scoprirai gli operatori e i tipi nel linguaggio di programmazione Kotlin.

Passaggio 1: esplora gli operatori numerici

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

Come per gli altri linguaggi, Kotlin utilizza +, -, * e / per più, meno, per 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 Mac) dopo ogni operazione.
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 degli 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. Chiama alcuni metodi sui numeri. Kotlin mantiene i numeri come primitive, ma ti consente di chiamare metodi sui 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: esercitati a utilizzare i tipi

Kotlin non esegue conversioni implicite tra tipi di numeri, quindi non puoi assegnare un valore short direttamente a una variabile long o un Byte a un Int. Questo perché la conversione implicita dei numeri è una fonte comune di errori nei programmi. Puoi sempre assegnare valori di tipi diversi tramite il casting.

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

IntelliJ IDEA mostra un elenco di possibili completamenti. Il 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 tipi diversi.
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 più leggibili le costanti numeriche lunghe, Kotlin 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 provi ad assegnare di nuovo qualcosa, viene visualizzato un errore. Con var, puoi assegnare un valore e poi 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 assegnarne uno nuovo, perché è definito con var. Il tentativo di assegnare un nuovo valore a aquarium genera un errore perché è definito con val.

Il tipo che memorizzi in una variabile viene dedotto quando il compilatore può capirlo dal contesto. Se vuoi, puoi sempre specificare esplicitamente il tipo di una variabile utilizzando la notazione con i due punti.

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

Una volta assegnato un tipo da te o dal compilatore, non puoi modificarlo, altrimenti riceverai un errore.

Passaggio 4: scopri di più sulle stringhe

Le stringhe in Kotlin funzionano in modo simile a quelle di qualsiasi altro linguaggio di programmazione che utilizza " per le stringhe e ' per i singoli caratteri. Puoi concatenare le stringhe con l'operatore +. Puoi creare modelli di stringa combinandoli con i valori; il nome $variable viene sostituito con il testo che rappresenta il valore. Questa operazione è chiamata interpolazione delle variabili.

  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 con 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 a conoscere i valori booleani e a controllare le condizioni nel linguaggio di programmazione Kotlin. Come altri linguaggi, Kotlin ha valori booleani e operatori booleani come minore di, uguale a, maggiore di e così via (<, ==, >, !=, <=, >=).

  1. Scrivi una dichiarazione if/else.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
    println("Good ratio!") 
} else {
    println("Unhealthy ratio")
}
⇒ Good ratio!
  1. Prova un intervallo in un'istruzione if. In Kotlin, la condizione che testi può utilizzare anche gli intervalli.
val fish = 50
if (fish in 1..100) {
    println(fish)
}
⇒ 50
  1. Scrivi un if con più casi. Per condizioni più complicate, utilizza gli operatori logici AND && e OR ||. Come in altre lingue, puoi avere più casi 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 una when dichiarazione. Esiste un modo più semplice per scrivere quella serie di istruzioni if/else if/else in Kotlin, utilizzando l'istruzione when, che è simile all'istruzione switch in altri linguaggi. 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à, imparerai a conoscere le variabili nullable e non nullable. Gli errori di programmazione che coinvolgono i valori null sono stati la causa di innumerevoli bug. Kotlin cerca di ridurre i bug introducendo variabili non nullabili.

Passaggio 1: scopri di più sulla nullabilità

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 punto interrogativo, ?, dopo il tipo per indicare che una variabile può essere nulla. Dichiara un Int? e assegnagli null.
var marbles: Int? = null

Quando hai tipi di dati complessi, ad esempio un elenco:

  • Puoi consentire che gli elementi dell'elenco siano nulli.
  • Puoi consentire che l'elenco sia nullo, ma se non è nullo i suoi elementi non possono essere nulli.
  • Puoi consentire che l'elenco o gli elementi siano nulli.

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

Passaggio 2: scopri di più su ? e ?:

Puoi testare null con l'operatore ?, risparmiando la fatica di scrivere molte istruzioni if/else.

  1. Scrivi un codice più lungo per verificare se la variabile fishFoodTreats non è null. Poi decrementa la variabile.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
    fishFoodTreats = fishFoodTreats.dec()
}
  1. Ora esaminiamo il modo di scriverlo in Kotlin, utilizzando l'operatore ?.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
  1. Puoi anche concatenare test null con l'operatore ?:. Guarda questo esempio:
fishFoodTreats = fishFoodTreats?.dec() ?: 0

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

Un punto sui puntatori null

Se ami davvero NullPointerExceptions, Kotlin ti consente di mantenerli. L'operatore di asserzione non null, !! (double-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 a conoscere array ed elenchi e diversi modi per creare loop nel linguaggio di programmazione Kotlin.

Passaggio 1: crea gli elenchi

Gli elenchi sono un tipo fondamentale in Kotlin e sono simili agli elenchi in altri linguaggi.

  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. Rimuovere un elemento.
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true

Il metodo remove() restituisce true quando rimuove correttamente l'elemento passato.

Passaggio 2: crea array

Come altri linguaggi, Kotlin ha array. A differenza degli elenchi in Kotlin, che hanno versioni modificabili e immutabili, non esiste una versione modificabile di un Array. Una volta creato un array, le dimensioni sono fisse. Non puoi aggiungere o rimuovere elementi, se non copiandoli 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à dell'array java.util.Arrays.toString() per stamparlo.
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 combinare i tipi, il che è utile. Dichiara un array con tipi diversi.
val mix = arrayOf("fish", 2)
  1. Puoi anche dichiarare array con un solo tipo per tutti gli elementi. Dichiara un array di numeri interi utilizzando intArrayOf(). Esistono builder o funzioni di creazione di istanze corrispondenti 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 e liste nidificati. Come in altri linguaggi, puoi nidificare array ed elenchi. ovvero, quando inserisci un array all'interno di un altro array, ottieni un array di array, non un array appiattito dei contenuti dei due. Gli elementi di un array possono anche essere elenchi e gli elementi degli 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 stamparlo, Kotlin stampa l'indirizzo anziché i contenuti dell'array.

  1. Una delle funzionalità più interessanti di Kotlin è che puoi inizializzare gli array con il codice anziché inizializzarli a 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 si trova tra le parentesi graffe, {}. Nel codice, it si riferisce all'indice dell'array, a partire da 0.

Passaggio 3: crea i loop

Ora che hai elenchi e array, l'iterazione degli elementi funziona come previsto.

  1. Crea un array. Utilizza un ciclo for per scorrere 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 scorrere gli elementi e gli 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 diverse dimensioni e intervalli dei passaggi. Puoi specificare intervalli di numeri o caratteri in ordine alfabetico. Come in altre lingue, non devi avanzare di 1. 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 alcuni loop. Come altri linguaggi, Kotlin ha cicli while, cicli do...while e operatori ++ e --. Kotlin ha anche cicli repeat.
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 altri linguaggi per quanto riguarda le basi come operatori, elenchi e cicli, ma ci sono alcune differenze importanti.

Le seguenti funzionalità potrebbero essere diverse in Kotlin rispetto a quelle che usi in altre lingue:

  • I tipi Kotlin non possono essere convertiti implicitamente. Utilizza il casting.
  • Le variabili dichiarate con val possono essere assegnate una sola volta.
  • Le variabili Kotlin non sono nullabili per impostazione predefinita. Usa ? per rendere le variabili nullable.
  • Con Kotlin, puoi scorrere contemporaneamente l'indice e gli elementi di un array in un ciclo for.

I seguenti costrutti di programmazione Kotlin sono simili a quelli di altri linguaggi:

  • Array ed elenchi possono avere un solo tipo o tipi misti.
  • Array ed elenchi possono essere nidificati.
  • 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 maggiori informazioni su un argomento di questo corso o se hai difficoltà, https://kotlinlang.org è il punto di partenza migliore.

Tutorial di Kotlin

Il sito web https://try.kotlinlang.org include tutorial dettagliati 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 Kotlin Bootcamp for Programmers.

IntelliJ IDEA

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

Questa sezione elenca i possibili compiti a casa per gli studenti che seguono questo codelab nell'ambito di un corso guidato da un insegnante. Spetta all'insegnante:

  • Assegna i compiti, se richiesto.
  • Comunica agli studenti come inviare i compiti.
  • Valuta i compiti a casa.

Gli insegnanti possono utilizzare questi suggerimenti nella misura che ritengono opportuna e sono liberi di assegnare qualsiasi altro compito a casa che ritengono appropriato.

Se stai seguendo questo codelab in autonomia, sentiti libero di utilizzare questi compiti per casa per mettere alla prova le tue conoscenze.

Rispondi a queste domande

Domanda 1

Quale delle seguenti opzioni dichiara un elenco di stringhe non modificabile?

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

▢ 357

Domanda 3

A cosa serve il punto interrogativo in questo codice?
var rocks: Int? = 3

▢ Il tipo di variabile rocks non è fisso.

▢ La variabile rocks può essere impostata su null.

▢ La variabile rocks non può essere impostata su null.

▢ La variabile rocks non deve essere inizializzata immediatamente.

Passa alla lezione successiva: 3. Funzioni

Per una panoramica del corso, inclusi i link ad altri codelab, vedi "Kotlin Bootcamp for Programmers: Welcome to the course" (Kotlin Bootcamp per programmatori: benvenuto al corso).