2017-03-27 2 views
4

Unten ist der Code, den ich zu verstehen versuchen:Scala- Reißverschluss mit Futures

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) 

} 

Das Problem:

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

hier, wenn Sie bemerken, ich bin kein mit "" vor dem zip und einfach einen platz geben. Ich vermute, dass . und Space funktioniert auf die gleiche Weise und validierte auch einige Stapelüberlauffragen. Der obige Ausdruck vor dem Anwenden einer Map führt zu einem Future [(List [String], List [String])]. also wenn ich sage

.map(x=x.tail) should show compilation error in IDE because tail operation can be applied only on list and not for tuple. But it is actually executing successfully.

The same statement when executed with "." before zip function like this:

val details = studentIds.zip(Future{List("Tim","Joe","Fin")}).map(x=>x.tail) the map(x=>x.tail) gives error.

was könnte der Grund sein?

Antwort

6

Wenn Sie den Raum auslassen (durch die . ersetzen) Sie müssen auch die Klammern weglassen, sonst wird der Compiler prüfen, was auch immer, nachdem er als Teil des anfänglichen Ausdrucks kommt - in Ihrem Fall der map(x => x.tail) wird die Future{List("Tim", "Joe", "Fin")} angewandt werden.

Ein einfaches Beispiel kann hier zu beachten:

val y = 3 to(5).toDouble 

Die #toDouble ist auf die Anzahl tatsächlich angewendet 5. Wenn Sie versuchen, die definierten Bereich Methoden zu verwenden, wird es nicht funktionieren.

zurück zu Ihrem Code gehen, wenn Sie die . vor dem Endrekursion entfernen, werden Sie den erwarteten Compiler-Fehler erhalten:

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

Was Sie (und zu tun in Ihrer letzten Zeile) weglassen müssen, ist nicht die Klammern um 'Future', es ist der Punkt vor' map'. Andernfalls müssten Sie sie auch in 'map _.tail' auslassen. –