代码之家  ›  专栏  ›  技术社区  ›  ant2009

在lambda表达式中使用rxjava2 completeable时显式返回类型

  •  0
  • ant2009  · 技术社区  · 7 年前
    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()希望返回一个完整的,但isendmail.sendmail返回单位:

    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)
            }  
    

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

    感谢您的到来,

    1 回复  |  直到 7 年前
        1
  •  1
  •   ConstOrVar    7 年前
    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<Unit>

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

    现在编译器理解了callable应该返回 单位 ,所以它允许调用 iSendMail.sendMail() 无需明确返回 调用() 功能。