【问题标题】:explicit return type when using rxjava2 completable in lambda expression在 lambda 表达式中使用可完成的 rxjava2 时的显式返回类型
【发布时间】:2018-09-26 02:02:43
【问题描述】:
Android Studio 3.3
RxJava 2

我无法理解 lambda 的显式返回。

例如,我使用的是干净的架构,并且在我的数据层中,我有以下接口和实现(不返回任何可完成的)

界面:

interface ISendMail {
    fun sendMail(tellNumber: String,
                 membershipNumber: String,
                 attachmentsType: String,
                 message: String,
                 subject: String)
}

实施:

class SendEmailImp : ISendMail {
    override fun sendMail(tellNumber: String, membershipNumber: String, attachmentsType: String, message: String, subject: String) {
        TODO("implement sending the email")
    }
}

在我的域层中,这是我遇到问题的地方: 接口返回一个可完成的:

interface SendMail {
    fun sendEmail(tellNumber: String,
                  membershipNumber: String,
                  attachmentsType: String,
                  message: String,
                  subject: String): Completable
}

实现和问题是 call() 想要返回 Completable,但 iSendMail.sendMail 返回 Unit:

class SendMailImp(val iSendMail: ISendMail) : SendMail {
    override fun sendEmail(tellNumber: String, membershipNumber: String, attachmentsType: String, message: String, subject: String): Completable {
        return Completable.fromCallable(object: Callable<Completable> {
            override fun call(): Completable {
                return iSendMail.sendMail(tellNumber, membershipNumber, attachmentsType, message, subject)
            }
        })
    }
}

但是,如果我像这样使用 lambda,一切正常:

 return Completable.fromCallable {
            iSendMail.sendMail(tellNumber, membershipNumber, attachmentsType, message, subject)
        }  

只是想知道这两种不同的方法之间有什么区别,第一种是显式的并且期望返回一个 Completable。第二个使用 lambda?

非常感谢,

【问题讨论】:

    标签: kotlin rx-java2


    【解决方案1】:
    return Completable.fromCallable {
             iSendMail.sendMail(tellNumber, membershipNumber, attachmentsType, message, subject)
        }
    

    将生成下一个 java 代码

    Completable.fromCallable((Callable)(new Callable() {
            // $FF: synthetic method
            // $FF: bridge method
            public Object call() {
               this.call();
               return Unit.INSTANCE;
            }
    
            public final void call() {
               SendMailImp.this.getISendMail().sendMail(tellNumber, membershipNumber, attachmentsType, message, subject);
            }
         }));
    

    如您所见,call() 方法将返回 Unit 的实例。所以现在要解决您的第一种方法的问题,您需要明确定义可调用的类型 - Callable&lt;Unit&gt;

    return Completable.fromCallable(object: Callable<Unit> {
                override fun call() {
                    iSendMail.sendMail(tellNumber, membershipNumber, attachmentsType, message, subject)
                }
            })
    

    现在编译器知道 callable 应该返回 Unit,因此它允许调用 iSendMail.sendMail() 而无需从 call() 函数显式返回 Unit。

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2012-03-26
      • 1970-01-01
      • 2021-01-31
      相关资源
      最近更新 更多