2014-08-26 1 views
3

У меня есть следующий код:Как игнорировать значения None, когда карта над коллекцией

for { 
    totalUsers = currentUsers.map { u => 
    newUsersMap.get(u.username.get).map { t => 
     FullUser(t.username, u.firstName, u.lastName, u.batch, t.description) 
    } 
    } 
} yield { 
    totalUsers 
} 

Это возвращая Seq[Option[FullUser]] когда то, что я хочу это Seq[FullUser] - т.е. если вызов u.username.get возвращает None, то просто игнорируйте его. Как мне это сделать?

+0

Кстати, смешивание для понимания и комплексных преобразований по карте - это своего рода антипаттерн. –

ответ

5

Рассмотрите возможность плоскопанели.

val totalUsers = currentUsers.flatMap { u => 
    newUsersMap.get(u.username.get).map { t => 
    FullUser(t.username, u.firstName, u.lastName, u.batch, t.description) 
    } 
} 

Для некоторого объяснения, как Seq, Option и flatMap работают вместе, см, например this blog post.

+1

Если 'u.username' является' Option', который может быть 'None', я бы предложил' u.username.flatmap (newUsersMap.get) .map {t => ... ' – Kigyo

+0

@ Kigyo, это правильно –

+0

@ Kigyo, как это отличается? – jcm

4

Просто попробуйте для понимания

for { 
    user <- currentUsers 
    username <- user.username.toList  //you need to convert to seq type to prevent ambiguous option seq mix problems. 
    t <- newUserMap.get(username).toList 
} yield FullUser(t.username, u.firstName, u.lastName, u.batch, t.description) 

для смешивания с flatMap или map не читается.

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