2014-01-08 4 views
2

Вот как я мои модели созданы:Sum список объектов в Scala

case class Game(id: Long) 
case class GamePlayer(id: Long, gameId: Long, points: BigDecimal) 

Я хотел бы получить сумму всех очков игроков игры. Итак, вот что я пробовал:

val pointTotal = allGames.toSeq.map(allGamePlayers(_.id).map(_.points)).sum 

Как я могу заставить это работать в Scala?

+0

Что такое тип ' allGames' и подпись 'allGamePlayers()'? и должен ли 'allGamePlayers()' действительно принимать функцию в качестве аргумента? –

ответ

1
val pointTotal = allGames.flatMap((g: Game) => allGamePlayers(g.id).map(_.points)).sum 

вы также можете использовать список понимание:

val pointTotal = (for(game <- allGames; 
        player <- allGamePlayers(game.id) 
       ) yield player.points).sum 
+0

Кажется, что это сработает, но я все равно получаю ту же ошибку: 'Отсутствует тип параметра для расширенной функции ((x $ 1) => x $ 1.id)' – goo

+0

@Jon - я обновил ответ, он появляется для работы, если вы укажете тип 'Game'. – Lee

2

Гадать здесь, как вы не указали некоторые типы:

val pointTotal = (
    allGames flatMap { 
    game => allGamePlayers(game.id) map (_.points) 
    } 
).sum 

отмечают, что game должны быть указаны в явном виде, в противном случае компилятор думает, что вы пытаетесь передать лямбду на allGamePlayers

Смежные вопросы