Ответ 1
Я написал простую групповую операцию (на самом деле a Groupable
trait
с неявным преобразованием из Iterable
), что позволило бы группировать ваши сделки с помощью currency
:
trait Groupable[V] extends Iterable[V] {
def groupBy(f: V => K): MultiMap[K, V] = {
val m = new mutable.HashMap[K, Set[V]] with mutable.MultiMap[K, V]
foreach { v => m add (f(v), v) } //add is defined in MultiMap
m
}
}
implicit def it2groupable(it: Iterable[V]): Groupable[V] = new Groupable[V] {
def elements = it.elements
}
Итак, Groupable
просто предоставляет способ извлечь ключ из каждого элемента в Iterable
и затем группировать все такие элементы, которые имеют один и тот же ключ. Итак, в вашем случае:
//mm is a MultiMap[Currency, Trade]
val mm = trades groupBy { _.currency }
Теперь вы можете сделать довольно простой mapElements
(mm
- это Map
) и foldLeft
(или /:
), хорошо понимающий оператор foldLeft
, поскольку он обеспечивает чрезвычайно сжатые скопления над наборами), чтобы получить сумму:
val sums: Map[Currency, Int] = mm mapElements { ts =>
(0 /: ts) { (sum,t) => sum + t.notional }
}
Извините, если я допустил некоторые ошибки в этой последней строке. ts
- значения mm
, которые (конечно) Iterable[Trade]
.