Kotlin值分配

时间:2018-08-09 15:03:42

标签: java android kotlin

尝试使用此代码,并希望使用最少的重复代码来做到这一点。在Java中,我会以这种方式(作为一个古老的Java程序员)这样做。作为参考,dataMap<String, String>

Class action = SomeActivity.class;
if (data != null && data.get("abc") != null) {
    if (data.get("abc").contains("details")) {
        action = OtherActivity.class;
    } ... //may have more ifs for other contains()
}

Intent newIntent = new Intent(this, action);

我想在Kotlin中做同样的事情,但不重复空条件并使用多条分配行。这就是我到目前为止所拥有的。

val action = data["abc"]?.let {
    if (it.contains("details")) {
        OtherActivity::class.java
    } else {
        SomeActivity::class.java
    }
} ?: kotlin.run { SomeActivity::class.java }

val intent = Intent(this, action)

在我看来,Java在这里看起来比Kotlin更有效,有了Kotlin,我有两条重复执行SomeActivity::class.java的赋值行,而在Java中,我可以将变量设置为一个类,并且当且仅当所有null和条件检出将分配新的类。因此,在Kotlin中有没有一种方法可以为SomeActivity::class.java分配重复的行?

5 个答案:

答案 0 :(得分:4)

对于所提供的代码,以下应该起作用:

val intent = Intent(this, 
   data?.takeIf { it["abc"]?.contains("details") == true }
       ?.let { OtherActivity::class.java } 
       ?: SomeActivity::class.java
)

如果您还有其他分支,那么您当然应该使用when语句。

val abc = data?.get("abc")

val action = when {
    abc == null -> SomeActivity::class.java
    abc.contains("details") -> OtherActivity::class.java
    // other branches
    else -> SomeActivity::class.java
}
val intent = Intent(this, action)

答案 1 :(得分:2)

也许以下内容对您有用:

val action = if (data?.get("abc")?.contains("details") == true) {
    OtherActivity::class.java
} else SomeActivity::class.java
val intent = Intent(this, action)

请注意,您需要== true,因为条件的左侧部分可能仍为null,在这种情况下,条件将导致:null == true,然后基本上只返回{ {1}}。

如果您喜欢〜一个衬纸或SomeActivity::class.java

when

最后,您还可以使用与Java中相同的构造,方法是使用val intent = Intent(this, when { data?.get("abc")?.contains("details") == true -> OtherActivity::class.java /* Other conditions */ else -> SomeActivity::class.java }) 并指定您的常规类型,例如:

var

答案 2 :(得分:1)

您可以使用when块来整洁地完成此操作:

val abc = data["abc"]
val action = when {
    abc == null -> OtherActivity::class.java
    abc.contains("details") -> DetailsActivity::class.java
    abc.contains("somedata") -> SomeActivity::class.java
    abc.contains("otherdata") -> UnknownActivity::class.java
    else -> DefaultActivity::class.java
}

或者不重复变量名:

val action = data["abc"].run {
    when {
        this == null -> OtherActivity::class.java
        contains("details") -> DetailsActivity::class.java
        contains("somedata") -> SomeActivity::class.java
        contains("otherdata") -> UnknownActivity::class.java
        else -> DefaultActivity::class.java
    } 
}

或者如果您有能力使用equals代替contains

val action = when(abc) {
    null -> OtherActivity::class.java
    "details" -> DetailsActivity::class.java
    "somedata" -> SomeActivity::class.java
    "otherdata" -> UnknownActivity::class.java
    else -> DefaultActivity::class.java
}

请注意,第一种情况是捕获null可使其他分支智能广播为不可为空的类型。

答案 3 :(得分:0)

您以这种方式进行

    val action = data["abc"]?.let {
        if (it.contains("details")) OtherActivity::class.java
            else SomeActivity::class.java
    }

    val intent = Intent(this,action)

如果data [“ abc”]为null,则不调用let块。所以你可以这样做。

防止空赋值(如果deta [“ abc”

   val action= data["abc"]?.let {
        if (it.contains("details")) OtherActivity::class
            else SomeActivity::class
    } ?: DefaultActivity::class

    val intent = Intent(this,action.java)

答案 4 :(得分:-1)

您可以使用when和中间null来不重复else分支。

val action: KClass<out Activity> = data?.get("abc")?.let {
   when {
     it.contains("details") -> OtherActivity::class
     it.contains("bla")     -> BlaActivity::class
     else                   -> null
  }
} ?: SomeActivity::class

val intent = Intent(this, action.java)

请注意,如果data["abc"]为空,data不起作用