字符串空值处理
先来看一段代码
fun getUserName(uName: String): String { return "userName=" + uName}fun main(args: Array) { println(getUserName("nwd123123")) /** * 总结: * 如果参数 uName 不能为空的话,那么在调用时所传的值就不可能为空; * 如果有必要传递 null 值,那么需要在函数参数类型后面加上 ? */ println(getUserName(null))}
说明:在 main 函数调用了函数 getUserName 函数,并传入参数 nwd123123,运行结果如下:
userName=nwd123123
这没有什么难度,但是我们实际开发中,有可能用户名为 null,那么在 java 中需要我们手动去判断做对应的处理,但是 kotlin 也是一样的吗?修改上述代码如下:
fun getUserName(uName: String): String { return "userName=" + uName}fun main(args: Array) { // 这个时候编译器已经给出错误提示,程序是没法编译通过的,提示信息如图 println(getUserName(null))}
说明:Kotlin 语言自动做了非空处理,也就是帮我们判断了这里的参数是否为 null,这点相对于 java,又是一个优势所在。
但是我们有时候参数可以为空,甚至有时候就需要传一个值为 null 的参数,那该怎么办呢?看下面的代码:
// 请注意这里的参数类型后面的变化fun getUserName(uName: String?): String { return "userName=" + uName}fun main(args: Array) { println(getUserName(null))}
说明:如果允许传递 null 值,那么在形参类型的后面的加上?即可。
when 表达式
Kotlin 中的 when 对应 java 中的 switch...case ,下面看 kotlin 中的 when 几种写法。
第一种写法
// 基本写法fun getDayHours(type: Int) { when (type) { 1 -> println("我每天至少保持学习 ${type} 个小时.") 2 -> println("我每天至少保持不行 ${type} 公里.") 7 -> println("我每天至少保持休息 ${type} 个小时.") else -> println("除了工作之外,请记得给自己放松。") }}
说明:不再有 case 和 break 关键字,而是直接使用 -> 和 else 就搞定了,而且在 java 中的 break 语句要是忘记了,会引起想不到的后果,但是 kotlin 就不会存在这个问题,这又是一大优势所在。
第二种写法
fun getHourFromLanage(lanage: String): Float { var hour=when (lanage) { "Kotlin" -> 1f "Android" -> 0.5f "Python" -> 0.5f else -> 8f } return hour}
说明: Kotlin 中的 when 表达式是有返回值的,所以,当函数有返回值的时候可以直接将 when 表达式的值作为函数的返回值。
第三种写法:直接返回 when 表达式的值
fun getHourFromLanage(lanage: String)=when (lanage) { "Kotlin" -> 1f "Android" -> 0.5f "Python" -> 0.5f else -> 8f}
说明:是第二种写法的在升级,这里其实函数 getHourFromLanage 的返回值写也可以,不写也可以。
第四种写法:不带参数的 when
/*** 不带参数的 when*/fun whenSensorGenerator(gradeA: Int, gradeB: Int)=when { (gradeA - gradeB >=15) -> "存在偏科情况" (gradeA - gradeB < 15 && gradeA - gradeB > 0) -> "基本不偏科" (gradeA - gradeB==0) -> "均衡发展" else -> "暂无记录"}
说明:同样该函数的返回值可写,也可不写。这样的表达式是不是很简洁呢?