2015-11-10 5 views
0

У меня есть последовательность идентификаторов и функция, которая возвращает параметр [workItem] для каждого идентификатора. Все, что я хочу сделать, это генерировать последовательность workItem из этих двух вещей. Я пробовал различные комбинации карт, foreach и для понимания, и ничего не работает.Создайте новую последовательность scala из другой последовательности

def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[Option[WorkItem]]] = { 
    ids.map { 
     id: workItemId => id.map(getWorkItem(_) 
    } 
} 

Это дает мне ошибку - выражение типа Seq [Опция [WorkItem] не соответствует ожидаемому типу _B

Я попытался Еогеасп -

def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[Option[WorkItem]]] = { 
    ids.map {_.foreach(getWorkItem(_)}  
} 

Это дает мне ошибку - Expression типа Unit не соответствует ожидаемому типу _B

Я не уверен, что это за тип _B и как я могу это сделать.

+0

Что вы хотите, чтобы произошло, если функция не возвращает None? –

+0

@ RamonJ.RomeroyVigil Я не решаю, что просто вернусь к последовательности опций. –

+0

Возможный дубликат [Как сгладить список параметров с использованием функций более высокого порядка?] (Http://stackoverflow.com/questions/2895069/how-to-flatten-list-of-options-using-higher-order-functions) –

ответ

1

Будет работать почти так, как вы ожидали.

trait o { 

    class Id {} 
    class WorkItem { } 

    def getWorkItem(id: Id): Option[WorkItem] 

    def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[Option[WorkItem]]] = { 
    val res = ids.map { idsSeq => 
     idsSeq.map { id => 
     getWorkItem(id) 
     } 
    } 
    res 
    } 



} 

Но для меня getWorkItems должен вернуть Future[Seq[WorkItem]] чем вместо внутреннего map вы можете использовать flatMap

def getWorkItems(ids: Future[Seq[Id]]): Future[Seq[WorkItem]] = { 
    val res = ids.map { idsSeq => 
     idsSeq.flatMap { id => 
     getWorkItem(id) 
     } 
    } 
    res 
    }