首页 > 解决方案 > 如何一起使用 completablefuture 和 Streams

问题描述

我想同时CompletableFuture工作Stream。类似于将 aCompletableFuture<Stream<String>>转换为CompletableFuture<Stream<Team>>.

我从CompletableFuture<String>to做了类似的事情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是否会成为StringStream,如果我可以那样映射它......

标签: javaasynchronousjava-8java-streamcompletable-future

解决方案


因此,让我们将问题分解为两个较小的问题:

  1. 转换CompletableFuture<T>CompletableFuture<R>
  2. 将 aStream<String>转换为Stream<Team>

第一个可以使用thenApplyor来实现thenApplyAsync。第二个可以使用实例map上的标准操作来实现。Stream

现在,一旦您尝试将它们结合起来,就像应用 的任何其他转换一样考虑CompletableFuture<String>,现在应该很清楚您可以简单地执行以下操作:

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

s是一个Stream<String>被转换成Stream<Team>的 - 这两种类型之间没有神奇的转换


推荐阅读