Sie .toStream()
verwenden, was bedeutet, dass die ganze Sammlung faul ist. Ohne es wäre Ihre Ausgabe zuerst hundert "tuend" s gefolgt von Zahlen von 1 bis 100. Jedoch wertet Stream
nur das erste Element aus, das den Ausgang "doing 1" gibt, wo es stoppt. Das nächste Element wird bei Bedarf ausgewertet.
Jetzt konnte ich keine Details dazu in den Dokumenten finden, aber ich nehme an, dass runForeach
eine Implementierung hat, die das nächste Element vor dem Aufruf der Funktion auf dem aktuellen Element übernimmt. Bevor also println
auf Element n aufgerufen wird, untersucht es zuerst Element n + 1 (z. B. überprüft, ob es existiert), was zu einer "tuing n + 1" -Nachricht führt. Dann führt es Ihre println
Funktion auf dem aktuellen Element aus, was zu der Nachricht "n" führt.
Müssen Sie wirklich map()
vor Ihnen runForeach
? Ich meine, brauchen Sie zwei Reisen durch die Daten? Ich weiß, ich bin wahrscheinlich das Offensichtliche, aber wenn Sie nur Ihre Daten in einer so gehen verarbeiten:
val rx = Source((1 to 100).toStream)
rx.runForeach({ t =>
Thread.sleep(1000)
println(s"doing $t")
// do something with 't', which is now equal to what "doing" says
})
dann haben Sie kein Problem, was bei der Auswertung ist.
Akka-Stream hat immer einen Puffer von einem Element vor jeder Berechnungsstufe. Wahrscheinlich siehst du das. – eiennohito