Если упорядочен атрибут, который вы хотите использовать для сравнения, то это работает:
import scala.collection.immutable.SortedSet
val set1 = SortedSet(list1: _*)(Ordering by (_.name))
val set2 = SortedSet(list2: _*)(Ordering by (_.name))
val result = set1 &~ set2 union set2 &~ set1
val result2 = set1 | set2 diff set1 & set2 // also works
Теперь, если это невозможно, это работает:
for {
x <- list1 ++ list2 // you want elements from both, right?
if list1.forall(_.name != x.name) || list2.forall(_.name != x.name)
} yield x
Очень неэффективно. Чтобы сделать его эффективным, используйте Map
:
def carName = (x: Car) => x.name -> x
val map1 = (list1 map carName).toMap
val map2 = (list2 map carName).toMap
for {
x <- list1 ++ list2 // you want elements from both, right?
if map1(x).isEmpty || map2(x).isEmpty
} yield x