Каков наилучший способ применить более одного CompletableFuture к результату другого CompletableFuture?

Я бы сказал легкий путь, описанный здесь:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing

df[df['B'] > 10]

0
задан maxpovver 13 July 2018 в 16:20
поделиться

1 ответ

Вы можете сделать это, используя CompletionStage.thenCompose(Function) в сочетании с CompletableFuture.allOf(CompletableFuture...) . Общая сигнатура Function, используемая thenCompose, является: Function<? super T, ? extends CompletionStage<U>>.

public CompletableFuture<Void> loadAndApply(SomeObject object) {
  return loadData().thenCompose(data ->
      CompletableFuture.allOf(
          CompletableFuture.runAsync(() -> object.setA(processA(data)), swingExecutor),
          CompletableFuture.runAsync(() -> object.setB(processB(data)), backgroundExecutor)
      ) // End of "allOf"
  ); // End of "thenCompose"
} // End of "loadAndApply"

Это имеет дополнительное преимущество. В коде, который вы используете в настоящее время на этапе thenAcceptAsync, нужно дождаться завершения этапа thenApplyAsync до его выполнения. При использовании вышеуказанного оба setA и setB будут запускаться одновременно в своих соответствующих исполнителях.

Для удобства здесь Javadoc для allOf:

Возвращает новый CompletableFuture, который завершается, когда все данные CompletainFutures завершаются. Если какой-либо из заданных CompletableFutures выполняется исключительно, то возвращенный CompletableFuture также делает это, при этом исключение CompletionException содержит это исключение в качестве причины. В противном случае результаты, если таковые имеются, данных CompletableFutures не отражаются в возвращаемом CompletableFuture, но могут быть получены путем их индивидуального осмотра. Если нет CompletableFutures, возвращает CompletableFuture, заполненную нулевым значением.

Среди приложений этого метода заключается в том, чтобы дождаться завершения набора независимых CompletingFutures перед продолжением программы, как в: CompletableFuture.allOf ( c1, c2, c3) .join ();.

... и Javadoc для thenCompose:

Возвращает новое CompletionStage, которое завершен с тем же значением, что и CompletionStage, возвращаемым данной функцией.

Когда этот этап завершается нормально, данная функция вызывается с результатом этого этапа в качестве аргумента, возвращая другой CompletionStage. Когда этот этап завершается нормально, CompletionStage, возвращаемый этим методом, завершается с тем же значением.

Чтобы обеспечить прогресс, предоставленная функция должна организовать окончательное завершение своего результата.

Этот метод аналогичен опции Optional.flatMap и Stream.flatMap.

См. документацию CompletionStage для правил, охватывающих исключительное завершение.

Примечание: CompletableFuture, который реализует CompletionStage, переопределяет thenCompose, но делает тип возврата более конкретным (возвращает CompletableFuture, а не CompletionStage) .

0
ответ дан Slaw 17 August 2018 в 13:02
поделиться
  • 1
    Спасибо, что показал этот потрясающий однострочный лайнер :) – maxpovver 13 July 2018 в 16:24
  • 2
    @MaxPovver Нет проблем :) Это также имеет преимущество, которое я отредактировал, отвечая на заметку, о том, чтобы позволить процессу A и процессу B запускаться одновременно. (Тем не менее, я предполагаю, что процесс, выполняющийся на swingExecutor, не занимает слишком много времени, поэтому преимущество здесь не может быть реализовано). – Slaw 13 July 2018 в 16:42
Другие вопросы по тегам:

Похожие вопросы: