首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mono.map和java optional.map之间有什么区别。它能与Java Optionnal结合使用吗?

mono.map和java optional.map之间有什么区别。它能与Java Optionnal结合使用吗?
EN

Stack Overflow用户
提问于 2022-08-29 03:37:59
回答 2查看 136关注 0票数 0

mono.map和java optional.map之间有什么区别。

它能与Java Optionnal结合使用吗?

我的代码如下所示,不幸的是,有两个警告。

代码语言:javascript
复制
@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");
}

所以如果出现错误,我会这样修改它。

代码语言:javascript
复制
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.

这个代码很难看,怎么改进呢?

代码语言:javascript
复制
   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");
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-29 06:48:07

map接受一个项,并可能将其转换为另一个项,并将其返回到起始上下文中。

Mono/Flux不允许包含null值。相反,我们使用Mono.empty()来表示任何内容。

当您在Mono中放置某些内容并使用映射时,您的代码处于反应性上下文中,这意味着服务器可以将线程的使用优化到最大。

在第二个示例中,您将一些内容放入Optional<T>中,然后在之外执行所有转换,即反应性上下文,完成后,将结果放入使用Mono#just的反应性上下文中。

第二个例子是我所说的假反应代码。当人们使用旧的命令式java做他们想做的所有事情,然后将最终结果放在一个Mono中时。

不是反应性

您在反应性上下文中花费的时间越长,框架就越能优化其资源使用。

在您的示例中,您应该使用第一个示例,并通过检查并返回一个Mono.empty()来处理每个映射函数中的潜在空值。

票数 1
EN

Stack Overflow用户

发布于 2022-09-02 01:26:59

通常,您希望避免java流/可选内容。rx世界围绕null和阻塞等都有不同的语义。

通常情况下,最好是传递表达式并让执行上下文处理控制流。例如:

代码语言:javascript
复制
  public Mono<String> resolve(ServerWebExchange exchange) {
    return Mono.just(exchange.getRequest())
        .mapNotNull(ServerHttpRequest::getRemoteAddress)
        .mapNotNull(InetSocketAddress::getAddress)
        .mapNotNull(InetAddress::getHostAddress)
        .defaultIfEmpty("0.0.0");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73523905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档