【问题标题】:Better RXJava2 Maybe chaining更好的 RXJava2 也许链接
【发布时间】:2021-01-08 09:45:06
【问题描述】:

我必须在异步链中处理 Maybe。事实上,我想通过异步邮件客户端(vertx rxjava2 邮件客户端)发送电子邮件

邮件可能有一个附件,也可能没有。

于是我写了一个方法:

private fun getAttachment() : Maybe<MailAttachment>

使用此方法的代码如下所示:

private fun buildMail() : Single<MailMessage> {

    return getAttachment()
        .switchIfEmpty(Single.just(MailMessage()))
        .map { attachment ->
            val mail = MailMessage()
                .setFrom("...")
                ...

            if (attachment.name != null) {
               mail.setAttachment(attachment)
            }
        }
}

如您所见,当可能为空时,我切换到邮件消息的空新实例,但我真的不喜欢这种创建空元素并在地图中测试元素是否“填充”的方式。

我认为必须有更好的方法来处理这种逻辑?!

可以将附件放在一个列表中并返回一个 Single,然后在地图中测试列表是否为空,但在我看来这并不是一个更好的方法,因为这看起来可能会有更多然后是一个附件。

【问题讨论】:

  • switchIfEmpty 应该是空的MailAttachment()?

标签: kotlin rx-java2 maybe


【解决方案1】:

我通常不使用 Maybe,但我相信如果你只是想删除 if,你可以尝试这样的事情:

        getAttachment()
            .map { attachment ->
                // This only happens if Maybe returns a value
                val mail = MailMessage()
                mail.setAttachment(attachment)

                return@map mail
            }
            .toSingle(MailMessage())
            .map { mail ->
                mail.setFrom("...")
                // ...
            }
            .subscribe().addTo(disposables)

如果你不想在两个地方创建 MailMessage(),那么你可以试试这样的:

        Single.just(MailMessage().setFrom("..."))
            .flatMap { mail ->
                getAttachment()
                    .map { attachment ->
                        mail.apply {
                            this.attachment = attachment
                        }
                    }.toSingle(mail)
            }

第一种方法更容易阅读(在我看来),但两者都应该工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多