首页 > 解决方案 > Elvis 运算符,如果 != null 则返回或执行完全不同的操作

问题描述

我有一个名为 Subscription 的模型和一个试图接收该订阅的服务,但如果订阅不存在,我想调用一个不同的服务。

我的目标是:

val recipientSubscription = subscribeService.getSubscription(pushMessage.recipient)
        ?: cachingService.add(pushMessage)
    

但这不起作用,因为现在收件人订阅不再属于订阅类型。

我该如何解决这个问题?

标签: kotlin

解决方案


subscribeService.getSubscription(pushMessage.recipient)和的返回类型cachingService.add(pushMessage)相同,因此会产生错误。值的返回类型default应与可空值相同。

这是我的例子:

    val a: Int? = null //a is integer
    val b: Int = a ?: 3 //Valid, default value of b is 3, which is integer
    val c: Int = a ?: "s" //<-- Invalid, default value is not Integer

如果您有更多问题,请告诉我。

编辑

风格 1(更Java喜欢):使用传统的 if-else 方法

    var recipientSubscription = subscribeService.getSubscription(pushMessage.recipient)
    if (recipientSubscription == null) {
        cachingService.add(pushMessage) //Add subscription.
        recipientSubscription = subscribeService.getSubscription(pushMessage.recipient) //set subscription again.
    }

Style 2 (more KotlinLike):使用Kotlin 的run作用域函数方法

    val recipientSubscription = subscribeService.getSubscription(pushMessage.recipient)
        ?: run {
           cachingService.add(pushMessage) //Add subscription.
           subscribeService.getSubscription(pushMessage.recipient) //return new subscription.
        }

推荐阅读