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

Kotlin val分配

  •  0
  • JPM  · 技术社区  · 8 年前

    遇到这种情况,想用最少的重复代码来实现。在Java中,我会这样做(作为一个老Java程序员)。作为参考, data 是一个 Map<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::类.java ?

    5 回复  |  直到 8 年前
        1
  •  4
  •   EpicPandaForce Jigar Joshi    8 年前

    对于所提供的代码,应执行以下操作:

    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)
    
        2
  •  2
  •   Roland    8 年前

    也许下面的方法对你有用:

    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 .

    如果您喜欢~one lines或 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);
    
        3
  •  1
  •   Pawel    8 年前

    你可以用 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 作为第一种情况,允许其他分支智能转换为不可为空的类型。

        4
  •  0
  •   Shudipto Trafder    8 年前

    你这样做

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

    如果数据[“abc”]为空,则不调用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)
    
        5
  •  -1
  •   TheOperator    8 年前

    你可以用 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 可以为空!