【问题标题】:Scala- zip with futuresScala- 带有期货的压缩包
【发布时间】:2017-08-19 22:41:49
【问题描述】:

下面是我想要理解的代码:

object Tryouts extends App{
    val studentIds= Future{
        List("s1","s2","s3")
    }
    val details = studentIds zip(Future{List("Tim","Joe","Fin")}).map(x=>x.tail)
    details.foreach(println)
    Thread.sleep(1000)

}

问题:

val 详细信息 = studentIds zip(Future{List("Tim","Joe","Fin")}).map(x=>x.tail)

在这里,如果您注意到,我没有使用“。”在拉链之前,只是给一个空间。我猜可能是 。和空间都以相同的方式工作,并验证了一些堆栈溢出问题。应用地图之前的上述表达式将导致我成为 Future[(List[String],List[String])]。所以当我说

.map(x=x.tail) 应该在 IDE 中显示编译错误,因为尾部操作只能应用于列表而不是元组。但它实际上执行成功了。

使用“.”执行时的相同语句在 zip 函数之前是这样的:

val details = studentIds.zip(Future{List("Tim","Joe","Fin")}).map(x=>x.tail) 地图(x=>x.tail) 给出错误.

可能是什么原因?

【问题讨论】:

    标签: scala future scala-collections


    【解决方案1】:

    当您省略空格(通过替换 .)时,您还必须省略括号,否则编译器会将后面的任何内容视为初始表达式的一部分 - 在您的情况下,map(x => x.tail) 将应用于Future{List("Tim", "Joe", "Fin")}

    这里有一个简单的例子:

    val y = 3 to(5).toDouble
    

    #toDouble实际上是应用于数字5。如果你尝试使用范围定义的方法,它不会起作用。

    回到你的代码,如果你在尾部调用之前删除.,你会得到预期的编译错误:

    val details = ids zip Future.successful(List("Tim", "Joe", "Fin")) map (_.tail)
    // compile error: "Cannot resolve symbol tail"
    

    【讨论】:

    • 您需要省略(并在最后一行中执行的操作)不是Future 周围的括号,而是map 之前的点。否则,您还必须在 map _.tail 中省略它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2012-09-24
    相关资源
    最近更新 更多