检查Kotlin中when语句中的数组大小和列表大小

时间:2018-02-12 18:51:01

标签: java kotlin

我是Kotlin的新手和编程。 我非常喜欢模式匹配的想法,正如您在下面的代码中看到的那样,我正在尝试使用when语句。

<div class="tradeoff-cell">
    <span class="tradeoff-title">Lower RL Rate</span>
    <div class="tradeoff-icon"><svg class="svg-inline--fa fa-chart-line fa-w-16" aria-hidden="true" data-prefix="fa" data-icon="chart-line" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" data-fa-i2svg=""><path fill="currentColor" d="M500 384c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12V76c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v308h436zM456 96H344c-21.4 0-32.1 25.9-17 41l32.9 32.9-72 72.9-55.6-55.6c-4.7-4.7-12.2-4.7-16.9 0L96.4 305c-4.7 4.6-4.8 12.2-.2 16.9l28.5 29.4c4.7 4.8 12.4 4.9 17.1.1l82.1-82.1 55.5 55.5c4.7 4.7 12.3 4.7 17 0l109.2-109.2L439 249c15.1 15.1 41 4.4 41-17V120c0-13.3-10.7-24-24-24z"></path></svg><!-- <i class="fa fa-line-chart" aria-hidden="true"></i> -->
    </div>
</div>

如果您运行代码,结果为:

fun main(args: Array<String>) {


    val myAr = arrayOf(1,2,3)
    val myL = listOf(1,2,3)

    fun probablyBlind() {

       when(myL.size != myAr.size) {

          myL.size > myAr.size -> {
            println("myL.size > myAr.size = ${myL.size > myAr.size}")
          }
          myL.size < myAr.size -> myAr.forEach { println(it) }
      }

      if(myL.size != myAr.size) {
        println("Inside if. myL.size > myAr.size = 
        ${myL.size > myAr.size}")
      }
   }

   probablyBlind()
 }

这意味着在某些时候列表的大小与数组的大小不同。 然后它在when语句中计算为true的第一个比较。 但后来打印出来的是虚假的。这意味着它不应该运行这部分代码。 if语句永远不会计算为true。

有人可以帮我吗? 也许这是我目前无法看到的非常简单的事情。 如果是这样的话,请原谅。

2 个答案:

答案 0 :(得分:9)

when(myL.size != myAr.size)

您在此指定when - 表达式为Boolean值,即比较MyL.sizemyAr.size的结果。我们说它们是平等的,这意味着您搜索值为false的匹配项。

myL.size > myAr.size - 您的第一个when - 条款。由于大小相等,因此评估为false并匹配when表达式。

你真正想说的只是

when {
    myL.size > myAr.size -> {
        println("myL.size > myAr.size = ${myL.size > myAr.size}")
      }
    myL.size < myAr.size -> myAr.forEach { println(it) }
}

答案 1 :(得分:1)

以下只是展示另一种可能性,它可能在更复杂的场景中有意义。

您可以将比较结果包装到一些对象中,使when子句看起来很好,如下所示:

fun probablyBlind() {
    when (ComparisonResult.of(myAr.size, myL.size)) {
        Equal -> {
            println("equally sized")
        }
        RightGreater -> println("myL.size > myAr.size = ${myL.size > myAr.size}")
        LeftGreater -> myAr.forEach { println(it) }
    }
}

要使其正常工作,只需创建以下包装器:

sealed class ComparisonResult {
    companion object {
        fun of(t1: Int, t2: Int): ComparisonResult = when {
            t1 == t2 -> Equal
            t1 > t2 -> LeftGreater
            t1 < t2 -> RightGreater
            else -> throw IllegalStateException()
        }
    }
}

object Equal : ComparisonResult()
object LeftGreater : ComparisonResult()
object RightGreater : ComparisonResult()