gpt4 book ai didi

scala:映射元组的 future

转载 作者:行者123 更新时间:2023-12-04 13:22:58 24 4
gpt4 key购买 nike

我有一个 TupleFuture 像这样 Future[(WriteResult, MyObject)] mytuplefuture,我想映射它并且用 MyObject 做一些事情,所以我这样做:

mytuplefuture.map((wr,obj)=>{ //do sth});

但我的 eclipse scala IDE 不允许并建议我这样做:

mytuplefuture.map{ case(wr,obj) => { //do sth }}

这两者有什么区别?

我习惯做第一个,直到我尝试返回包裹在未来的元组之前我不知道第二个

myfuture.map((obj) => { // do sth with obj })

很明显,我正在映射 Future 的内容并用它做一些事情,这将返回另一个 future ,因为原来的 myfuture 只包含 future 的东西(obj)..

谁能解释一下?

最佳答案

区别在于:

map 是一个高阶函数 (HOF),它将函数作为参数。这个函数——为方便起见,我们称它为映射函数——它本身有一个参数,即完成的Future 的值。在这种特殊情况下,这个值恰好是一个元组。您的第一次尝试假设可以将元组分解为两个参数,然后将被映射函数 接受 - 但这种情况不会发生,因此会出现错误。

您似乎可以像这样定义映射函数(注意参数周围的额外括号):

mytuplefuture.map(((wr,obj)) => /* do sth */)

但是 Scala 编译器目前不支持此功能。 (也就是说,我认为这可能是 future Scala 版本的一个特性。)

因此,另一种方法是使用case 语句将映射函数 编写为部分函数。以下内容:

mytuplefuture.map {
case (wr,obj) => //
}

实际上是一种简写形式:

mytuplefuture.map {
tuple: (WriteResult, MyObject) => tuple match {
case (wr,obj) => // do sth
}
}

事实上,这种简写除了用于打开元组之外,通常还适用于其他情况。例如:

myList.filter {
case A => true
case _ => false
}

是以下的缩写:

myList.filter {
x => x match {
case A => true
case _ => false
}
}

那么,假设您只想查看元组的 MyObject 成员。您可以按如下方式定义它:

val myfuture = mytuplefuture.map {
case (_, obj) => obj
}

或者,或者,明确使用元组参数:

val myfuture = mytuplefuture.map(tuple => tuple._2)

这又可以简化为:

val myfuture = mytuplefuture.map(_._2)

第一个下划线是映射函数的第一个参数的简写。 (第二个下划线,如在 _2 中,是元组中第二个值的名称的一部分,而不是速记 - 这就是 Scala 可能有点困惑的地方.)

所有前面的三个示例都返回一个 Future[MyObject]

如果您随后将 map 应用于此值,则在这种情况下,单个 mapping function 参数将是您的 MyObject 实例。因此你现在可以写:

myfuture.map(obj => /* Do something with obj */)

关于您问题的其余部分,应用于Future 值的映射函数确实适用于原始 future 的结果,因为它可以' 被执行直到第一个 future 完成。因此,当第一个 future 完成时,map 返回一个完成(成功或失败)的 future 。

已更新:阐明了 map 的参数实际上是什么。感谢@AlexeyRomanov 纠正了我的错误,感谢@RhysBradbury 指出了我最初的错误。 ;-)

关于scala:映射元组的 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com