List 基于未来结果的排序

List 基于未来结果的排序,list,scala,sorting,future,List,Scala,Sorting,Future,我正在尝试按未来的布尔值对列表进行排序 我有一个ID列表,我需要查询一个外部服务,以了解它们背后是否有上下文信息。我用于执行此操作的方法返回一个可选的未来 通过使用分区方法,我希望创建两个ID列表,一个包含上下文信息,另一个不包含上下文信息 下面的答案对此提供了很多帮助: 我现在有一个粗略的,未经测试的方法 val futureMatch = listOfIds.map( b => b.map{ j => getContext(j).map{ k => Map( j

我正在尝试按未来的布尔值对列表进行排序

我有一个ID列表,我需要查询一个外部服务,以了解它们背后是否有上下文信息。我用于执行此操作的方法返回一个可选的未来

通过使用分区方法,我希望创建两个ID列表,一个包含上下文信息,另一个不包含上下文信息

下面的答案对此提供了很多帮助:

我现在有一个粗略的,未经测试的方法

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]]
not
list[Map[String,Option[String]]
而失败列表只是一个字符串列表,因此它只需要是一维的。目前,我有两个相同的列表签名,它们有一些冗余。例如,在成功列表中,我知道这将存在,因此它不需要作为选项

有什么想法我可以实现这种结构,并产生两个不同的签名列表,或者即使这是最有效的方式

谢谢


编辑:查看分区的签名看起来我只能生成两个具有相同签名的列表,因此可能要求使用不同的签名太多。我想我可以在之后将列表展平。

我也在我链接的问题的注释中找到了合适的解决方案

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)
     }
   }
唯一的问题是它会导致类型擦除。我打开了另一个问题来讨论这个问题


谢谢大家。

什么是
listOfIds
?你能从REPL中提供一个例子吗?
listOfIds:List[Object]=List(Map(d->1,e->2),a,b,c)
List[Object]
是一种危险的类型,因为你在编译时对
List
的元素一无所知。你肯定比诉诸
List[Object]做得更好
。说得好。我自己在构建列表,这样我就可以做任何事情。我猜不匹配的类型可能仍然是一个带有可选值的映射。整个列表可能是这样。嗯。当我想到它时,包含列表也是相当多余的。回到绘图板上!