Как использовать завершаемое будущее и потоки вместе - PullRequest
2 голосов
/ 01 июля 2019

Я хочу работать с CompletableFuture и Stream одновременно.Что-то вроде преобразования CompletableFuture<Stream<String>> в CompletableFuture<Stream<Team>>.

Я сделал что-то похожее с CompletableFuture<String> до CompletableFuture<Integer>.

CompletableFuture<Stream<String>> getMostPopularTeamNames(int maxResults) {
    CompletableFuture<Stream<String>> mostPopularTeamNames;

    WorldCupSocialApi.getMostPopularTeamNames(1, maxResults, teams -> {
        mostPopularTeamNames = CompletableFuture.supplyAsync(() -> teams.stream());
    });

    return mostPopularTeamNames;
}

Я пытаюсь сделать что-то вроде:

CompletableFuture<Stream<Team>> cf = getMostPopularTeamNames(5).thenApply(s -> {
    s.map(name -> new Team(name))
}

Но я не уверен, что я s буду String или Stream, и смогу ли я отобразить это таким образом ...

1 Ответ

3 голосов
/ 01 июля 2019

Итак, давайте разберем проблему на две меньшие задачи:

  1. Преобразование CompletableFuture<T> в CompletableFuture<R>
  2. Преобразование Stream<String> в Stream<Team>

Первый может быть достигнут с помощью thenApply или thenApplyAsync. Второго можно достичь с помощью стандартной операции map на экземпляре Stream.

А теперь, когда вы попытаетесь объединить их, подумайте о том, как применить любое другое преобразование CompletableFuture<String>, и теперь должно стать ясно, что вы можете просто сделать:

CompletableFuture<Stream<Team>> cf = getMostPopularTeamNames(5)
  .thenApply(s -> s.map(name -> new Team(name));

s - это Stream<String>, который преобразуется в Stream<Team> - между этими двумя типами нет магического преобразования

...