я считаю себя постоянно делать такие вещи, как следующее:Общий шаблон сканирования(), где я в конечном счете не заботиться о состоянии
val adjustedActions = actions.scanLeft((1.0, null: CorpAction)){
case ((runningSplitAdj, _), action) => action match {
case Dividend(date, amount) =>
(runningSplitAdj, Dividend(date, amount * runningSplitAdj))
case s @ Split(date, sharesForOne) =>
((runningSplitAdj * sharesForOne), s)
}
}
.drop(1).map(_._2)
Где мне нужно накопить runningSplitAdj
, в этом случае, для того, для исправления дивидендов в списке действий. Здесь я использую scan
для поддержания состояния, которое мне нужно для исправления действий, но в конце мне нужны только действия. Следовательно, мне нужно использовать null для начального действия в состоянии, но, в конце концов, удалить этот элемент и отобразить все состояния.
Есть ли более элегантный способ их структурирования? В контексте RxScala наблюдаемых, я на самом деле сделал новый оператор, чтобы сделать это (после некоторой помощи из списка рассылки RxJava):
implicit class ScanMappingObs[X](val obs: Observable[X]) extends AnyVal {
def scanMap[S,Y](f: (X,S) => (Y,S), s0: S): Observable[Y] = {
val y0: Y = null.asInstanceOf[Y]
// drop(1) because scan also emits initial state
obs.scan((y0, s0)){case ((y, s), x) => f(x, s)}.drop(1).map(_._1)
}
}
Однако теперь я считаю себя делать это в списки и векторы тоже, так что Интересно, есть ли что-то более общее, что я могу сделать?