kotlin学习day8:表达式和ranges

来源:互联网 发布:国际版的中国软件 编辑:程序博客网 时间:2024/06/07 06:05

先创建一个简单的集合,方便我们进行演示

val mList = listOf(1, 2, 3, 4)

1.if表达式

Kotlin中一切都是表达式,也就是说一切都可以返回一个值。首先if语句我们可以像Java中那样使用它:

    if (condition) {        //do something    } else if (condition) {        //do something    } else {        //do something    }

其次,我们也可以把结果赋值给一个变量:

var z = if(condition) x else y

所以 if 表达式总是返回一个value。如果一个分支返回了Unit,那整个表达式也将
返回Unit,它是可以被忽略的,这种情况下它的用法也就跟一般Java中的 if 条件
一样了。

//if条件表达式    mList.forEach {    if (it > 2)        Log.i(TAG, it.toString()) else toast(it.toString())    }

运行结果:

09-10 20:02:57.272 31586-31586/com.example.lbjfan.kotlindemo I/LBJFAN: 309-10 20:02:57.273 31586-31586/com.example.lbjfan.kotlindemo I/LBJFAN: 4

2.When表达式

when表达式类似于Java中的switch/case语句,但是更加强大,该表达式会试图去匹配所有可能的分支,然后找到满意的一个语句,执行右边的表达式。与Java中的表达式不同的是他可以匹配任意类型的参数,并且分支也可以是一个条件。我们也可以增加一个else语句,当没有任何语句匹配时,该语句会执行!

//When条件表达式:简单的匹配Int类型      mList.forEachIndexed { index, value ->            when (value) {                //执行最先匹配的一条语句                //is Int -> Log("Value is Int")                1, 2 -> Log.i(TAG, "index:$index--value:$value")                3 -> Log.i(TAG, "value:$value--value:$index")                else -> {                    Log.i(TAG, "else value:$value--value:$index")                }            }        }

运行结果:

09-10 20:11:40.148 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index:0--value:109-10 20:11:40.148 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index:1--value:209-10 20:11:40.148 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: value:3--value:209-10 20:11:40.149 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: else value:4--value:3
//when条件表达式任意类型,且判断条件是一个表达式        val mViewList = listOf(TextView(this), Button(this), ImageView(this))        mViewList.forEachIndexed { index, view ->            when (view) {            //执行完条件语句会自动转型,不用像Java做类型转换                is TextView -> Log("index$index:is TextView")                is Button -> Log("index$index:is Button")                is ImageView -> Log("index$index:is ImageView")                else -> {                    Log(" is Other View")                }            }        }

运行结果:

09-10 20:11:40.157 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index0:is TextView09-10 20:11:40.157 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index1:is TextView09-10 20:11:40.157 8634-8634/com.example.lbjfan.kotlindemo I/LBJFAN: index2:is ImageView

3.for循环

虽然Kotlin中有很多功能强大的操作集合的函数操作符,但是如果去查看源码的话,不难发现,全都是基于最简单的迭代!

    //直接获取item    for (value in mList) {        Log("value:$value")    }

运行结果:

09-10 20:25:39.620 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:109-10 20:25:39.620 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:209-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:309-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: value:4
//使用index获取item    for (index in 0..mList.size - 1) {        Log("index:$index--value:${mList.get(index)}")    }

运行结果:

09-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:0--value:109-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:1--value:209-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:2--value:309-10 20:25:39.621 21866-21866/com.example.lbjfan.kotlindemo I/LBJFAN: index:3--value:4

4.While和do/while循环

Kotlin中的While和do/while语句和Java中的一样

while语句:

//While语句var x = 6while (x > 0) {    Log("x:$x")    x--}

运行结果:

09-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:609-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:509-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:409-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:309-10 20:31:45.286 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:209-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: x:1

do/while语句:

//do/while语句var y = 6do {    Log("y:$y")    y--  } while (y > 0)

运行结果:

09-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:609-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:509-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:409-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:309-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:209-10 20:31:45.287 27231-27231/com.example.lbjfan.kotlindemo I/LBJFAN: y:1

5.Ranges

range表达式使用..操作符,他是被定义实现了一个rangTo方法,可以帮助我们使用很多富有创造性的方式去简化我们的代码:例如:

    if (x >= 0 && x <= 10) {        Log("x:$x")    }

等价于:

    if (x in 0..10) {        Log("x:$x")    }

Range 被定义为可以被比较的任意类型,但是对于数字类型,比较器会通过转换
它为简单的类似Java代码来避免额外开销的方式来优化它。数字类型的 ranges 也
可以被迭代,编译器会转换它们为与Java中使用index的for循环的相同字节码的方
式来进行优化。

range默认自增长,因此下面的代码不会做任何事情

    if (x in 10..0) {        Log("x:$x")    }

对应的,要想使上面语句执行,我们可以使用downTo函数

    if (x in 10 downTo 0) {        Log("x:$x")    }

运行结果:

09-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 309-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 209-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 109-10 20:48:43.353 11479-11479/com.example.lbjfan.kotlindemo I/LBJFAN: 0

我们也可以在range中使用step来定义一个到一个值的不同的空隙

    for (it in 1..4 step 3) {        Log(it.toString())    }

运行结果:

09-10 20:52:44.699 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 109-10 20:52:44.699 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 4
    for (it in 4 downTo 1 step 2) {        Log(it.toString())    }

运行结果:

09-10 20:52:44.700 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 409-10 20:52:44.700 15648-15648/com.example.lbjfan.kotlindemo I/LBJFAN: 2

6.until函数

与range表达式不同的是until遍历时会跳过最后一个值:

 for (it in 1 until 4) {        Log(it.toString())    }

运行结果:

09-10 20:58:22.463 21094-21094/com.example.lbjfan.kotlindemo I/LBJFAN: 109-10 20:58:22.463 21094-21094/com.example.lbjfan.kotlindemo I/LBJFAN: 209-10 20:58:22.463 21094-21094/com.example.lbjfan.kotlindemo I/LBJFAN: 3

如果不使用until函数,我们使用index遍历数组时:

    //使用index获取item    for (index in 0..mList.size - 1) {        Log("index:$index--value:${mList.get(index)}")    }

使用until函数

 for (index in 0 until mList.size) {        Log("index:$index--value:${mList.get(index)}")    }
原创粉丝点击