[英]Better RXJava2 Maybe chaining
我必須在異步鏈中處理可能。 事實上,我想通過異步郵件客戶端(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)
}
}
}
如您所見,當可能為空時,我切換到郵件消息的空新實例,但我真的不喜歡這種創建空元素並在 map 中測試元素是否“填充”的方式。
我認為必須有更好的方法來處理這種邏輯?!
可以將附件放入列表並返回 Single<List> ,然后在列表為空時在 map 中進行測試,但在我看來這並不是一個更好的方法,因為這看起來可能有多個附件.
我通常不使用 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)
}
第一種方法更容易閱讀(在我看來),但兩者都應該工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.