Scala-根据Future结果谓词排序

杰克韦迪

我有一个要排序的对象数组,其中排序谓词是异步的。Scala是否具有标准或第三方库函数,用于基于类型签名为(T, T) -> Future[Bool]而不是的谓词进行排序(T, T) -> Bool

另外,还有其他方法可以构造此代码吗?我考虑过要找到列表元素的所有2对排列,在每个对上运行谓词,然后将结果存储在具有Map((T, T), Bool)这种效果的一个或某个结构中,然后对其进行排序-但我怀疑还会执行更多的比较甚至比单纯的排序算法还要好。

塞巴斯蒂安·洛伯(Sebastien Lorber)

如果您的谓词是异步的,则您可能也希望获得异步结果,并避免使用 Await

如果要List[(T,T)]根据将来的布尔谓词对a进行排序,则最容易对a进行排序List[(T,T,Boolean)]

因此,给定一个具有List[(T,T)]和的谓词(T, T) -> Future[Bool],如何获得一个List[(T,T,Boolean)]或者更确切地说,Future[List[(T,T,Boolean)]]如您要保持异步行为。

val list: List[(T,T)] = ...
val predicate = ...
val listOfFutures: List[Future[(T,T,Boolean]] = list.map { tuple2 => 
  predicate(tuple2).map( bool => (tuple2._1, tuple2._2, bool) 
}
val futureList: Future[List[(T,T,Boolean)]] = Future.sequence(listOfFutures)
val futureSortedResult: Future[List[(T,T)]] = futureList.map { list =>
    list.sort(_._3).map(tuple3 => (tuple3._1,tuple3._2))
}

这是伪代码,我没有编译,可能没有,但是您明白了。

最关键的是Future.sequence,非常有用的,这在某种程度上允许变换Monad1[Monad2[X]]Monad2[Monad1[X]],但请注意,如果你的任何断言未来的失败,全球排序操作也将是失败的。


如果您希望获得更好的性能,则将“批处理”调用返回到的服务的调用可能是一个更好的解决方案Future[Boolean]例如,(T, T) -> Future[Bool]您可以设计一个服务(如果您显然拥有它)List[(T, T)] -> Future[List[(T,T,Bool)],而不是这样,这样您就可以在异步单次调用中获得所需的一切。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章