Преобразование Promise.sequence (обещания) .map () в API CompletableStage. - PullRequest
0 голосов
/ 07 ноября 2019

Ссылки, с которыми я уже справился и которые мне не помогли:

Я пытаюсь обновить существующее приложение с Play Framework 2.4 до Play Framework 2.5. Для этого необходимо изменить все Promise на CompletionStage. Пока все хорошо, но я немного рассортирован по этим строкам:

List<Promise<WSResponse>> promises = new ArrayList<Promise<WSResponse>>();
for (TargetRequest tRequest : targets) {
    promises.add(/*get one promise*/);
}
return Promise.sequence(promises).map(new Function<List<WSResponse>, WSResponse>() {
    @Override
    public WSResponse apply(final List<WSResponse> responses) throws Throwable {
        return responses.isEmpty() ? null : responses.get(0);
    }
});

Как видите, эти строки переходят от List<Promise<WSResponse>> к Promise<WSResponse>, сначала переходя отот List<Promise<WSResponse>> до Promise<List<WSResponse>> и затем возвращает либо ноль, если List<WSResponse> пусто, либо первый из списка, если его нет.

Как мне все это сделать с помощью CompletableStagePromise? метод sequence().map() устарел. Я попробовал некоторые вещи, используя CompletableFuture.allOf(), toArray() и stream(), но ничего окончательного.

1 Ответ

0 голосов
/ 07 ноября 2019

Наконец-то получил:

    List<CompletionStage<WSResponse>> futures = new ArrayList<CompletionStage<WSResponse>>();
    for (TargetRequest tRequest : targets) {
      futures.add(/*get one future*/);
    }
    return CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]))
        .thenApply(v -> futures.stream().map(t -> t.toCompletableFuture().join())
            .collect(Collectors.toList()))
        .thenApply(responses -> responses.isEmpty() ? null : responses.get(0));
...