Expresiones for extendido

Las expresiones for se pueden utilizar para hacer consultas a bases de datos representadas como objetos, el operador que se observa en el ejemplo es producto cartesiano

val m2: Mascota = Mascota(Lucas,Maria)

scala> val m3 = Mascota("Sora","Juan")
val m3: Mascota = Mascota(Sora,Juan)

scala> val arrm = Array(m1,m2,m3)
val arrm: Array[Mascota] = Array(Mascota(Toby,Juan), Mascota(Lucas,Maria), Mascota(Sora,Juan))


scala> for{
     | m1 <- arrm
     | m2 <- arrm
     | if m1 != m2
     | if m1.dueño == m2.dueño
     | } yield m1.dueño
val res5: Array[String] = Array(Juan, Juan)

scala> (for{
     | m1 <- arrm
     | m2 <- arrm
     | if m1 != m2
     | if m1.dueño == m2.dueño
     | } yield m1.dueño).distinct

     val res6: Array[String] = Array(Juan)

La expresión for combina map, withFilter y flatMap

Cual es la diferencia entre filter y withFilter, filter calcula primero la colección y luego le aplica el filtro, withFilter retorna un generador que da los elementos que cumplen la función a medida que se solicitan.