Kotlin-入门(二)
上一篇文章《Kotlin-入门》写了kotlin的介绍、HelloWorld、函数定义、变量声明、各种注释以及字符串模板,这篇文章继续学习Kotlin的一些基础语法。
使用条件表达式
fun main(args: Array<String>) {
var a = 15
var b = 57
println("max of $a and $b is ${maxOf(a, b)}")
println("max of $a and $b is ${maxOf2(a, b)}")
}
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
/**
* 此函数返回单个表达式,可以使用单表达式函数来实现
*/
fun maxOf2(a: Int,b: Int) = if (a > b) a else b
执行结果:
max of 15 and 57 is 57
max of 15 and 57 is 57
Process finished with exit code 0
使用可空值及 null 检测
当某个变量的值可以为 null 的时候,必须在声明处的类型后添加 ?
来标识该引用可为空。
如果 str
的内容不是数字返回 null:
fun parseInt(str: String): Int? = str.toIntOrNull()
使用返回可空值的函数:
判值为null
时打印输入的数据不正确
fun main(args: Array<String>) {
printProduct("2","3")
printProduct("2a","3")
printProduct("2","3a")
}
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
if (x == null) {
println("Wrong number format in arg1: '${arg1}'")
return
}
if (y == null) {
println("Wrong number format in arg2: '${arg2}'")
return
}
// 在空检测后,x 和 y 会自动转换为非空值
println(x * y)
}
执行结果:
6
Wrong number format in arg1: '2a'
Wrong number format in arg2: '3a'
Process finished with exit code 0
当值不为null
时打印输入的两个整数的乘积
fun main(args: Array<String>) {
printProduct("2","3")
printProduct("2a","3")
printProduct("2","3a")
}
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// 直接使用 `x * y` 可能会报错,因为他们可能为 null
if (x != null && y != null) {
// 在空检测后,x 和 y 会自动转换为非空值(non-nullable)
println(x * y)
}
else {
println("either '$arg1' or '$arg2' is not a number")
}
}
执行结果:
6
either '2a' or '3' is not a number
either '2' or '3a' is not a number
Process finished with exit code 0
使用类型检查和自动转换
使用is
运算符检测一个表达式是否某类型的一个实例。如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:
fun getStringLength(obj: Any): Int? {
if(obj is String){
// obj 经过is运算符检测过后,在该条件分支内已自动转换成String类型
return obj.length
}
// 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
return null
}
fun printLength(obj: Any) {
println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
}
fun main(args: Array<String>) {
printLength("HelloWorld")
printLength(5000)
printLength(true)
}
运行结果如下:
'HelloWorld' string length is 10
'500' string length is ... err, not a string
'true' string length is ... err, not a string
Process finished with exit code 0
当然还有如下写法:
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null
// `obj` 在这一分支自动转换为 `String`
return obj.length
}
fun getStringLength(obj: Any): Int? {
// `obj` 在 `&&` 右边自动转换成 `String` 类型
if (obj is String && obj.length > 0) {
return obj.length
}
return null
}
使用for
循环
for循环在java很常用,下面我们来看一下kotlin中的for循环怎么用:
fun main(args: Array<String>) {
val items = listOf("Hello","Kotlin","Hey")
for (item in items){
println(item)
}
}
执行结果如下:
Hello
Kotlin
Hey
Process finished with exit code 0
当然for循环的写法不止上面这一种,下面给展示一下其他写法(运行结果不一一贴了,有兴趣的可以自己试一下):
fun main(args: Array<String>) {
val items = listOf("Hello","Kotlin","Hey")
// 通过indices属性获取集合所有有效下标的一个集合
for (index in items.indices){
println("item at $index is ${items[index]}")
}
}
fun main(args: Array<String>) {
val items = listOf("Hello","Kotlin","Hey")
// 通过库函数withIndex进行遍历
for ((index, value) in items.withIndex()) {
println("the element at $index is $value")
}
}
当然又有同学可能会想通过for循环打印1到100,怎么写呢?
kotlin有一个Range(值范围)的概念。值范围表达式使用 rangeTo
函数来构造, 这个函数的操作符形式是 ..
。废话不多说,直接上代码:
fun main(args: Array<String>) {
for(i in 1..100) println(i)
}
一行代码搞定,是不是很强大。好了,for
循环暂时了解这么多。
使用 while
循环
fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
}
可以看出while
循环和java
里的几乎是没有区别的。当然 do..while
也是。
使用 when
表达式
when 取代了类 C 语言的 switch
操作符。其最简单的形式如下:
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x is neither 1 nor 2")
}
}
when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。 when 既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式, 符合条件的分支的值就是整个表达式的值,如果当做语句使用, 则忽略个别分支的值。(像 if 一样,每一个分支可以是一个代码块,它的值 是块中最后的表达式的值。)
如果其他分支都不满足条件将会求值 else 分支。 如果 when 作为一个表达式使用,则必须有 else 分支, 除非编译器能够检测出所有的可能情况都已经覆盖了。
如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
我们可以用任意表达式(而不只是常量)作为分支条件:
fun main(args: Array<String>) {
println(describe(1))
println(describe("Hello"))
println(describe(1000L))
println(describe(2))
println(describe("other"))
}
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}
执行结果如下:
One
Greeting
Long
Not a string
Unknown
Process finished with exit code 0
使用区间(range)
区间表达式由具有操作符形式 ..
的 rangeTo
函数辅以 in 和 !in 形成。 区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:
整型区间(IntRange
、 LongRange
、 CharRange
)有一个额外的特性:它们可以迭代。 编译器负责将其转换为类似 Java 的基于索引的 for-循环而无额外开销。
使用 in 运算符来检测某个数字是否在指定区间内:
for (i in 1..4) print(i) // 输出“1234”
如果你想倒序迭代数字呢?也很简单。你可以使用标准库中定义的 downTo()
函数
for (i in 4 downTo 1) print(i) // 输出“4321”
能否以不等于 1 的任意步长迭代数字? 当然没问题, 可以使用step()
函数
for (i in 1..4 step 2) print(i) // 输出“13”
for (i in 4 downTo 1 step 2) print(i) // 输出“42”
要创建一个不包括其结束元素的区间,可以使用 until
函数
for (i in 1 until 10) println(i)// i in [1, 10) 排除了 10
使用集合
如何迭代集合呢?
fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
for (item in items) println(item)
}
使用 in 运算符来判断集合内是否包含某实例:
fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
if ("banana" in items)
println("banana in the collection")
else
println("banana isn't in the collection")
}// 输出“banana is in the collection”
原文地址:https://zhouyang-cn.github.io/2017/05/31/kotlin-basic-syntax2/
**转载请注明原文地址,谢谢!。