【问题标题】:Sorting based on Future Result根据未来结果排序
【发布时间】: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.sequenceflatMap(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] 做得更好。
  • 好点。我正在自己构建列表,所以我可以做任何事情。我猜不匹配的类型仍然可能是一个带有可选值的映射。整个列表可能是这样的。嗯。当我想到它时,包含列表也非常多余。回到绘图板!

标签: list scala sorting future


【解决方案1】:

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

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

谢谢大家。

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多