前段时间我发现了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;
}
});
Scalaasync
能做什么而 Java 不能?也许在一些更复杂的情况下?我想念什么?