しばらく前に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 にできないことは? たぶん、もっと複雑なシナリオの場合は?何が恋しいですか?