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à.
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).
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.
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.
// 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)