基于未来结果排序

时间:2015-12-28 23:18:25

标签: list scala sorting future

我试图按照未来的布尔值对列表进行排序。

我有一个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.sequenceflatMap(identity)来压缩嵌套的期货层。

问题是这并不是非常有效。

理想情况下,成功列表的签名为List[Map[String, String]]而不是List[Map[String, Option[String]],失败的列表只是一个字符串列表,因此它只需要是一维的。目前看来,我有两个相同的列表签名,它们有一些冗余。例如,在成功的列表中,我知道这将存在,因此它不需要是一个选项。

任何想法如何实现此结构并生成具有不同签名的两个列表,或者即使这是最有效的方式。

感谢。

编辑:看看分区的签名看起来我只能生成两个相同签名的列表,所以不同的签名可能太多了。我想我之后可以将列表弄平。

1 个答案:

答案 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

谢谢大家。