Case Classes

Case classes automatically get: apply, unapply, equals, hashCode, toString, copy, Product and Serializable.

12.1 Basics

Case classes automatically get: apply, unapply, equals, hashCode, toString, copy, Product and Serializable.

case class User(name: String, email: String, age: Int = 0)

val u = User("Ann", "[email protected]", 30)
u.name                               // fields are public vals
u == User("Ann", "[email protected]", 30)    // true — structural equality
u.copy(age = 31)                     // immutable update
u.toString                           // "User(Ann,[email protected],30)"
val User(n, e, a) = u                // destructuring via unapply
u.productArity, u.productElementNames.toList

12.2 Case objects

case object Empty      // singleton with nice toString & pattern matching

12.3 Immutable updates of nested data

For deep updates use optics libraries: Monocle, Quicklens (e.modify(_.address.city).setTo("Bergen")).

case class Address(city: String)
case class Employee(name: String, address: Address)

val e = Employee("Bob", Address("Oslo"))
val moved = e.copy(address = e.address.copy(city = "Bergen"))