Я знаком с функциональными языками программирования, обычно в Scala и Javascript. Я работаю над проектом Java8 и не знаю, как я должен проходить через список/поток элемента, а также выполнять побочный эффект для каждого из них параллельно, используя собственный пул потоков и возвращать объект, на котором его можно послушать для завершения (пусть успех или неудача).
В настоящее время у меня есть следующий код, он работает (я использую реализацию Promise Promise в качестве возврата), но это кажется не идеальным, потому что ForkJoinPool не предназначен для использования для интенсивных вычислений ввода-вывода в первую очередь.
public static F.Promise<Void> performAllItemsBackup(Stream<Item> items) {
ForkJoinPool pool = new ForkJoinPool(3);
ForkJoinTask<F.Promise<Void>> result = pool
.submit(() -> {
try {
items.parallel().forEach(performSingleItemBackup);
return F.Promise.<Void>pure(null);
} catch (Exception e) {
return F.Promise.<Void>throwing(e);
}
});
try {
return result.get();
} catch (Exception e) {
throw new RuntimeException("Unable to get result", e);
}
}
Может ли кто-нибудь дать мне более идиоматическую реализацию вышеуказанной функции? В идеале, не используя ForkJoinPool, используя более стандартный тип возврата и самые последние API-интерфейсы Java8? Не уверен, что я должен использовать между CompletableFuture, CompletionStage, ForkJoinTask...