我有一个要排序的对象数组,其中排序谓词是异步的。Scala是否具有标准或第三方库函数,用于基于类型签名为(T, T) -> Future[Bool]
而不是的谓词进行排序(T, T) -> Bool
?
另外,还有其他方法可以构造此代码吗?我考虑过要找到列表元素的所有2对排列,在每个对上运行谓词,然后将结果存储在具有Map((T, T), Bool)
这种效果的一个或某个结构中,然后对其进行排序-但我怀疑还会执行更多的比较甚至比单纯的排序算法还要好。
如果您的谓词是异步的,则您可能也希望获得异步结果,并避免使用 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] 删除。
我来说两句