Scala- zip with future

时间:2017-03-27 09:33:26

标签: scala future scala-collections

以下是我想要了解的代码:

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 details = studentIds   拉链(未来{列表("添""乔""翅片")})。图(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)给出错误。

可能是什么原因?

1 个答案:

答案 0 :(得分:6)

当你省略空格时(通过替换.)你必须省略括号,否则编译器将考虑作为初始表达式的一部分后面的任何内容 - 在你的情况下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"