簡體   English   中英

Kotlin Val任務

[英]Kotlin val assignment

碰到這一點,並希望用最少的重復代碼來做到這一點。 在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和if條件檢查時它將分配新的班級。 那么有沒有辦法在Kotlin中做到這一點而無需為SomeActivity::class.java重復分配行?

對於提供的代碼,以下內容應該起作用:

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)

也許以下內容將為您工作:

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 ,然后基本上只返回SomeActivity::class.java

如果您喜歡〜一個襯墊或when

val intent = Intent(this, when {
  data?.get("abc")?.contains("details") == true -> OtherActivity::class.java
  /* Other conditions */ 
  else -> SomeActivity::class.java
})

最后,您還可以使用與Java中相同的構造,方法是使用var並指定常規類型,例如:

var action : Class<*> = SomeActivity::class.java
if (data?.get("abc")?.contains("details") == true) { 
  // Or add the conditions you actually had
  action = OtherActivity::class.java
}
Intent newIntent = new Intent(this, action);

您可以使用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將使其他分支智能廣播為不可為null的類型。

您以這種方式進行

    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)

您可以使用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可以為空!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM