Некоторое время назад я обнаружил Scala Async Project. Вопрос в том, что такое магическое в этом блоке async
, которое не может быть реализовано с помощью простых функций (без расширения макросов)?
Посмотрите на первый пример из введения:
import ExecutionContext.Implicits.global
import scala.async.Async.{async, await}
val future = async {
val f1 = async { ...; true }
val f2 = async { ...; 42 }
if (await(f1)) await(f2) else 0
}
Я не вижу ничего в приведенном выше примере, который не может быть написан в чистой Java. Этот код делает то же самое:
import java.util.concurrent.*;
import java.util.function.Supplier;
// First define a helper method for creating async blocks:
public static <T> ForkJoinTask<T> async(Supplier<T> supplier) {
return new RecursiveTask<T>() {
@Override
protected T compute() {
return supplier.get();
}
}.fork();
}
ForkJoinTask<Integer> future = ForkJoinPool.commonPool().submit(() -> {
ForkJoinTask<Boolean> f1 = async(() -> true);
ForkJoinTask<Integer> f2 = async(() -> 42);
if (f1.join()) {
return f2.join();
} else {
return 42;
}
});
Что может сделать Scala async
, что Java не может? Может быть, в случае более сложных сценариев? Что мне не хватает?