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.toList12.2 Case objects
case object Empty // singleton with nice toString & pattern matching12.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"))