【发布时间】:2016-04-02 19:34:34
【问题描述】:
我正在尝试按未来布尔值对列表进行排序。
我有一个 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]],失败的列表只是一个字符串列表,所以它只需要是一维的。就目前而言,我有两个相同的列表签名,它们有一些冗余。例如,在成功列表中,我知道这将存在,所以它不需要成为一个选项。
任何想法如何实现这种结构并生成两个具有不同签名的列表,或者即使这是最有效的方法。
谢谢。
编辑:查看分区的签名看起来我只能生成两个相同签名的列表,所以不同的签名可能太多了。我想我可以在之后将列表展平。
【问题讨论】:
-
listOfIds是什么?你能提供一个来自 REPL 的例子吗? -
listOfIds: List[Object] = List(Map(d -> 1, e -> 2), a, b, c) -
List[Object]是一种危险的类型,因为您在编译时对List的元素一无所知。你绝对可以比诉诸List[Object]做得更好。 -
好点。我正在自己构建列表,所以我可以做任何事情。我猜不匹配的类型仍然可能是一个带有可选值的映射。整个列表可能是这样的。嗯。当我想到它时,包含列表也非常多余。回到绘图板!