2014-01-30 3 views

ответ

36

Future.apply(None) создает асинхронное вычисление и выполняет его. Это означает, что создается дополнительный лямбда-объект и запланирована дополнительная задача (однако тривиальная задача).

Future.successful(None) только что производит уже завершенное будущее. Это более эффективно.

+0

Можете ли вы дать такой же пример реального мира для Future.successful? Я не могу понять, зачем нам это нужно, кроме того, что существующий интерфейс ждет Future [T], и мы хотим передать некоторое будущее с уже известным результатом? –

+1

@FatihDonmez Это, по сути, прецедент, да. Зачем писать два отдельных интерфейса, когда вы можете просто обернуть известные значения? – Casey

3

Я не думаю, что Future(None) дает большие накладные расходы, но все-таки в его реализация по умолчанию каждого вызова apply порождает новую задачу для пула потоков ForkJoin, в то время как Future.successful(None) завершается немедленно. И каждый звонок до map или flatMap в будущем создает новую задачу для опроса, что также дает некоторые накладные расходы, поэтому вы можете взглянуть на реализацию scalaz Future/Task, которая более тщательно обрабатывает такие детали.

Смежные вопросы