spring - 如何在通量流中获得实际价值,而不是 FluxLift?
问题描述
我得到了一个Publisher<DataBuffer> inputStream
论点。我想将该流转换为字符串,记录该字符串,然后我必须将该字符串再次作为 aPublisher
传递给另一个方法。
例子:
public Flux<Object> decode(Publisher<DataBuffer> inputStream) {
return DataBufferUtils.join(inputStream)
.map(buffer -> StandardCharsets.UTF_8.decode(buffer.asByteBuffer()).toString())
.doOnNext(arg -> LOGGER.info(arg))
.map(arg -> library.delegate(Mono.fromSupplier(() -> arg)))
.flatMapIterable(arg -> {
System.out.println(arg); //instanceof FluxLift??
return List.of(arg);
);
}
class ExternalLibrary {
//this ALWAYS returns a FluxLift
public Flux<Object> delegate(Publisher<String> inputString) {
//does not matter, I don't have control of this.
//lets assume it does the following:
return Flux.just(input).
flatMapIterable(buffer -> List.of("some", "result"))
.map(arg -> arg);
}
}
问题:为什么最后的参数flatMapInterable()
总是 type FluxLift
?而且:如何才能在这里返回真正的价值?
解决方案
为什么最终 flatMapInterable() 中的参数总是 FluxLift 类型?
因为你的 map 函数返回 Flux
.map(arg -> library.delegate(Mono.fromSupplier(() -> arg)))
怎么能在这里返回真正的价值?
当映射函数返回反应类型时,使用其中一个flatMap*
函数而不是map
. flatMapMany
适合您的情况:
public Flux<Object> decode(Publisher<DataBuffer> inputStream) {
return DataBufferUtils.join(inputStream) //Mono<DataBuffer>
.map(buffer -> StandardCharsets.UTF_8.decode(buffer.asByteBuffer()).toString()) //Mono<String>
.doOnNext(arg -> LOGGER.info(arg)) //Mono<String>
.flatMapMany(arg -> library.delegate(Mono.fromSupplier(() -> arg))) // Flux<Object>
.flatMapIterable(arg -> {
System.out.println(arg); // instanceof Object
return List.of(arg);
);
推荐阅读
- javascript - 将二进制音频文件作为 POSTMAN 二进制请求发送
- python - 基于经度和纬度的两地之间的距离
- python-3.x - 无法在数据帧的特定索引上更新具有不同值的特定行?
- c# - 如何将每行具有不同组合框项的 DataTable 绑定到 DataGridView?
- python - 如何在从python中的动态输入中删除重复项的同时合并两个列表
- javascript - AWS + express -fileupload 的多种文件
- android - 如何将 DD/MM/YYYY "13/09/21" 转换为 "Tuesday, April 1"
- javascript - 引导确认在 onClick 事件中不起作用?
- asp.net - 在 ASP.NET 中隐藏 http 请求头信息
- google-cloud-platform - 从 Google Auth 重定向回我的应用程序时,浏览器会停止……但只是有时