Вот относительно лаконичный способ, позволяющий избежать создания промежуточных карт:
import collection.breakOut
val m: Map[String, Sale] =
(for (s <- sales) yield (s.getSaleType + s.getSaleDate, s))(breakOut)
m.values.toList
но, честно говоря, я не вижу большого преимущества по сравнению с исходным кодом Java. Вы могли бы написать
val m = collection.mutable.HashMap.empty[String, Sale]
for (s <- sales) {
m(s.getSaleType + s.getSaleDate) = s
}
m.values.toList
Это не кажется мне менее ясным.