Scala — Cheat Sheet

Tag: scala, jvm, functional programming, oop, concurrency

Livello: intermedio

TL;DR: Linguaggio ibrido orientato agli oggetti e funzionale che gira su JVM. Ideale per sistemi distribuiti, concorrenza e data processing grazie alla forte tipizzazione e all'immutabilità.

Concetti chiave

Combina nativamente il paradigma orientato agli oggetti con la programmazione funzionale.

Tutto è un oggetto, inclusi i tipi base e le funzioni.

Immutabilità di default: si preferisce l'uso di costanti rispetto a variabili mutabili.

Inferenza dei tipi: il compilatore deduce il tipo senza obbligare a dichiararlo esplicitamente.

Pattern matching avanzato per destrutturare oggetti e gestire il flusso logico.

I Trait permettono la composizione di comportamenti (mixin) superando i limiti dell'ereditarietà multipla.

Piena interoperabilità con Java, permettendo di usare qualsiasi libreria dell'ecosistema JVM.

Gestione della concorrenza tramite Future e Promise, o modelli ad attori (es. Akka).

Domande tipiche e risposte pronte

Q: Qual è la differenza tra val, var e def?R: Uso val per costanti immutabili valutate subito, var per variabili mutabili, e def per dichiarare metodi che vengono valutati a ogni chiamata.

Q: A cosa servono le case class?R: Le uso per creare modelli di dati immutabili. Il compilatore genera in automatico metodi come equals, hashCode, toString e facilitano enormemente il pattern matching.

Q: Come previeni le NullPointerException in Scala?R: Evito completamente il null di Java usando il tipo Option. Questo mi costringe a gestire esplicitamente i casi Some(valore) e None.

Insidie e errori comuni

Scrivere codice "Java in Scala" abusando di var e cicli imperativi, invece di usare val e funzioni come map/fold.

Complicare eccessivamente il codice abusando di parametri impliciti e type system avanzato.

Dimenticare che le operazioni sulle collezioni di default (se non si usano le View o gli stream) creano copie intermedie in memoria.

Snippet e comandi

// Creazione di una case class
case class Developer(name: String, language: String)

// Esempio di pattern matching
def analyzeDev(dev: Developer): String = dev match {
  case Developer("Umberto", "Scala") => "Combinazione perfetta per Jarvis"
  case Developer(_, "Java")          => "Sviluppatore enterprise"
  case _                             => "Profilo da valutare"
}

// Gestione sicura dei valori assenti con Option
val maybeLevel: Option[String] = Some("Senior")
val message = maybeLevel.map(lvl => s"Livello: $lvl").getOrElse("Livello non specificato")

// Collections e high-order functions
val numbers = List(1, 2, 3, 4, 5)
val evensDoubled = numbers.filter(_ % 2 == 0).map(_ * 2)
Jarvis Interviews
Jarvis