我想从下面的代码中创建一个Future[(Class1,Class2,Class3)]
类型的Future。但是我发现唯一的方法是使用zip()。我发现这个解决方案很难看,而且不是最优的。有人能启发我吗?
val v = for (
a <- {
val f0:Future[Class1] = process1
val f1:Future[Class2] = process2
val f2:Future[Class3] = process3
f0.zip(f1).zip(f2).map(x => (x._1._1,x._1._2,x._2))
} yield a // Future[(Class1,Class2,Class3)]
我也尝试过使用Future.sequence(List(f0, f1, f2))
,但这不起作用,因为新的Future将具有Future[List[U]]
类型,其中U
是Class1/2/3
的lub,而我想要一个保留原始类型的3元组
4条答案
按热度按时间kxkpmulp1#
cwtwac6a2#
适用函式
你所要求的是一个将来的应用函子。参见scalaz**Applicative Builder**pattern。在
zip
的后面滚动你自己的函子应该是相当简单的这相当于直接适用格:
Scalaz附带了一个 banana braces 方法,该方法从目标和参数(即您所要求的)形成一个元组。因此,您的解决方案将是:
您只需为以下类型类定义一个类型类示例即可实现所有这些功能:
因此,对于未来,这看起来像:
(实际上,您还需要
Pure
和Functor
。您还可以实现Bind
-请参阅附录)这个模式的好处是你可以在任何地方看到它(例如,在
Option
,在Validation
,在List
等)。例如,两个流的笛卡尔积是:备注
Pure
在scalaz 7中已被重命名为Pointed
。*附录
将来的其他类型类示例:
lfapxunr3#
如果您使用的是akka,请查看数据流:http://doc.akka.io/docs/akka/2.0.2/scala/dataflow.html
您需要使用带分隔符的Continuations插件(但使用sbt很容易),然后类似于:
应编译。
在built.sbt中:
jgzswidk4#
你也可以用猫:
有几种有用的方法可以做到这一点:
第一个更通用的选项:
更简单:)它只返回元组Future[(f0.type,f1.type,f2.type)