我试图按照未来的布尔值对列表进行排序。
我有一个ID列表,我需要查询外部服务,以查明它们背后是否有上下文信息。我用来做这个的方法返回一个可选的未来。
通过使用分区方法,我希望创建两个ID列表,一个包含上下文信息,另一个没有。
以下答案为此提供了很多帮助:Scala - sort based on Future result predicate
我现在有一个粗略的,未经测试的方法,看起来像这样,
val futureMatch = listOfIds.map( b => b.map{ j =>
getContext(j).map{ k =>
Map( j -> k)
}
}).map(Future.sequence(_)).flatMap(identity)
val partitionedList = futureMatch.map(_.partition{
case (k, Some(v)) => true
case _ => false
})
正如在另一个问题中所建议的那样,我试图在同一级别获得所有答案,然后使用Future.sequence
和flatMap(identity)
来压缩嵌套的期货层。
问题是这并不是非常有效。
理想情况下,成功列表的签名为List[Map[String, String]]
而不是List[Map[String, Option[String]]
,失败的列表只是一个字符串列表,因此它只需要是一维的。目前看来,我有两个相同的列表签名,它们有一些冗余。例如,在成功的列表中,我知道这将存在,因此它不需要是一个选项。
任何想法如何实现此结构并生成具有不同签名的两个列表,或者即使这是最有效的方式。
感谢。
编辑:看看分区的签名看起来我只能生成两个相同签名的列表,所以不同的签名可能太多了。我想我之后可以将列表弄平。答案 0 :(得分:-1)
我在我关联的问题的评论中找到了合适的解决方案。
val (matched, unmatched) =
finalMatch.foldLeft(List.empty[Map[String, String]], List.empty[String]) {
case ((matched, unmatched), p) => p match {
case m:Map[String, String] => (m :: matched, unmatched)
case s:String => (matched, s :: unmatched)
}
}
唯一的问题是它会导致类型擦除。我打开了另一个问题来讨论这个问题。
Dealing with Type Erasure with foldLeft
谢谢大家。