允许对来自 CompletableFuture 的结果流进行多次迭代
>
将生成的未来转换为
CompletableFuture
将生成的未来转换为
Flux
通量
用例:
我想得到一个带有英超球队名称的序列(例如
Stream
CompletableFuture<Stream<String>> teams = asyncHttpClient
.prepareGet("http://api.football-data.org/v1/soccerseasons/445/leagueTable")
.execute()
.toCompletableFuture()
.thenApply(Response::getResponseBody)
.thenApply(body -> gson.fromJson(body, League.class));
.thenApply(l -> stream(l.standings).map(s -> s.teamName));
要重用生成的流,我有两个选项:
1. CompletableFuture<List<String>> res = teams.thenApply(st -> st.collect(toList()))
2. Flux<String> res = Flux.fromStream(teams::join).cache()
通量
或者我应该使用
CompletableFuture
更新了一些想法(2018-03-16):
可享受未来
〔PROS〕<code>列表
通量
[优点] 声明简洁
- [优点] 如果我们只想使用它一次,那么我们可以省略
.cache
() 并将其转发到下一层,它可以利用响应式 API,例如 web flux 反应式控制器,例如 @GetMapping(产生 =MediaType.TEXT_EVENT_STREAM) 公共 Flux
共2个答案
匿名用户
CompletableFuture<Stream<String>> teams = ...;
Flux<String> teamsFlux = Mono.fromFuture(teams).flatMapMany(stream -> Flux.fromStream(stream));
Fulc. fromStream(团队::加入)
是一种代码气味,因为它阻塞了当前线程以从另一个线程上运行的CompletableFuture
获取结果。
匿名用户
一旦您下载了排行榜,并且从该表中提取了球队名称,我不确定您是否需要一个准备好背压的流来迭代这些项目。将流转换为标准列表(或数组)应该足够好,并且可能具有更好的性能,不是吗?
例如:
String[] teamNames = teams.join().toArray(String[]::new);
相关问题
- HashMap如何跟踪entrySet等字段
- HashSet如何提供恒定时间添加操作?
- 在hashmap或hashtable中重新散列的成本
- @BeforeClass在ktor测试类中不工作
- Jest vanilla JavaScript JSDOM刷新失败,切换beforeAll到before每一个后的第二次测试中断
- 子类TestCase并使用JUnit 4注释
- 使用Junit重新运行失败的测试
- 线程“main”java. lang.NoClassDefFoundError中的异常:在Intellij[Spring boot]中
- 应该在ngOnDestroy()中将Angular组件变量设置为null吗?
- 我必须取消订阅ActivatedRoute(例如参数)可观察对象吗?
- ReactiveXJS和TypeScript-如何退订?
- Angular: in ngOnInit()当我重新加载组件时,我的rxjs Fucntion不会运行
- 你怎么能在ngOnInit上订阅两次?
- Angular 6-为什么使用@ngrx/store而不是服务注入
- 对于Angular router事件可观察,为什么没有取消订阅()?
- Angular2路由器(@angular2/router),如何设置默认路由?
- angular2@input-更改检测[重复]
- “this”在ngOnDestroy中未定义
- 在视图中使用@input可观察,但组件中的管道函数被忽略
- RxJS-订阅/取消订阅与filter()运算符