mono.map和java optional.map之间有什么区别。
它能与Java Optionnal结合使用吗?
我的代码如下所示,不幸的是,有两个警告。
@Override
public Mono<String> resolve(ServerWebExchange exchange) {
//1:Return null or something nullable from a lambda in transformation method.
//2: Too long maps chain. May cause performance overhead.
return Mono.just(exchange.getRequest())
//Warning-1:
.map(ServerHttpRequest::getRemoteAddress)
.map(InetSocketAddress::getAddress)
//Warning-2:
.map(InetAddress::getHostAddress)
.defaultIfEmpty("0.0.0");
}所以如果出现错误,我会这样修改它。
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(
Optional.of(exchange.getRequest())
.map(ServerHttpRequest::getRemoteAddress)
.map(InetSocketAddress::getAddress)
.map(InetAddress::getHostAddress)
.orElseGet(() -> "0.0.0")
);
}orElseGet和defaultIfEmpty的意思相同吗?
对于mono判断空值的最佳实践是什么?
谢谢你的解释!
更新:为了判断空值,我想使mono.map和optional.map一样优雅。喜欢optional.map fluent api.
这个代码很难看,怎么改进呢?
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest())
.flatMap(map -> {
if (map.getRemoteAddress() == null) {
return Mono.empty();
} else {
return Mono.just(map.getRemoteAddress());
}
})
.flatMap(map -> {
if (map.getAddress() == null) {
return Mono.empty();
} else {
return Mono.just(map.getAddress());
}
})
.map(InetAddress::getHostAddress)
.defaultIfEmpty("0.0.0");
}发布于 2022-08-29 06:48:07
map接受一个项,并可能将其转换为另一个项,并将其返回到起始上下文中。
Mono/Flux不允许包含null值。相反,我们使用Mono.empty()来表示任何内容。
当您在Mono中放置某些内容并使用映射时,您的代码处于反应性上下文中,这意味着服务器可以将线程的使用优化到最大。
在第二个示例中,您将一些内容放入Optional<T>中,然后在之外执行所有转换,即反应性上下文,完成后,将结果放入使用Mono#just的反应性上下文中。
第二个例子是我所说的假反应代码。当人们使用旧的命令式java做他们想做的所有事情,然后将最终结果放在一个Mono中时。
不是反应性的
您在反应性上下文中花费的时间越长,框架就越能优化其资源使用。
在您的示例中,您应该使用第一个示例,并通过检查并返回一个Mono.empty()来处理每个映射函数中的潜在空值。
发布于 2022-09-02 01:26:59
通常,您希望避免java流/可选内容。rx世界围绕null和阻塞等都有不同的语义。
通常情况下,最好是传递表达式并让执行上下文处理控制流。例如:
public Mono<String> resolve(ServerWebExchange exchange) {
return Mono.just(exchange.getRequest())
.mapNotNull(ServerHttpRequest::getRemoteAddress)
.mapNotNull(InetSocketAddress::getAddress)
.mapNotNull(InetAddress::getHostAddress)
.defaultIfEmpty("0.0.0");
}https://stackoverflow.com/questions/73523905
复制相似问题