2014-01-30 15 views

Antwort

36

Future.apply(None) erstellt asynchrone Berechnung und führt sie aus. Dies bedeutet, dass ein zusätzliches Lambda-Objekt erstellt wird und eine zusätzliche Aufgabe geplant ist (jedoch eine triviale Aufgabe).

Future.successful(None) produziert gerade bereits abgeschlossene Zukunft. Es ist effizienter.

+0

Können Sie das gleiche reale Beispiel für Future.successful geben? Ich kann nicht verstehen, warum wir das brauchen, außer der bestehenden Schnittstelle, die auf Future [T] wartet, und wir wollen etwas Zukunft mit bereits bekanntem Ergebnis weitergeben? –

+1

@FatihDonmez Das ist im Wesentlichen der Anwendungsfall, ja. Warum sollten Sie zwei separate Schnittstellen schreiben, wenn Sie die bekannten Werte einfach umbrechen können? – Casey

3

Ich glaube nicht, dass Future(None) einen großen Overhead gibt, aber immer noch in ihm jeder Aufruf apply Default-Implementierung ist für einen ForkJoin Thread-Pool eine neue Aufgabe laicht, während Future.successful(None) sofort beendet. Und jeder Anruf auf map oder flatMap auf die Zukunft erstellt eine neue Aufgabe für die Umfrage, die auch einige Overhead, so dass Sie möglicherweise einen Blick auf scalaz Future/Task-Implementierung, die solche Details behandelt, mehr vorsichtig sein möchten.

Verwandte Themen