- kotlin值得系列1:内置类型。基本类型,数组,Range区间,集合框架,函数,Lambda
- kotlin值得系列2,关于类你所应该知道的一切
- kotlin值得系列3、函数加强之 高阶函数、内联函数、集合变换与序列、SAM转换、常用的高阶函数
- kotlin值得系列4、变量,常量,表达式,运算符
- kotlin值得系列5、关于kotlin泛型,也许值得看的文章
- kotlin值得系列6、kotlin的反射,走一个?
- kotlin值得系列7、也是该看看注解annotation了
本文是kotlin系列第4篇
- 常量和变量
- 分支表达式
- 运算符与中缀表达式
- Lambda表达式
本来应该放在前面讲的,但是先说也没关系。相对 比较 基础的东西。
一、常量和变量
我们知道,kotlin有变量和常量。
- 变量用 var 表示,可重新赋值
- 常量用 val 表示,赋值后不可修改
但是变量和常量,本身也是可以再进行分类的。
常量 val
- 运行时常量(
val):编译期不能确定它的值,代码中会保留变量对它的引用。 - 编译期常量(
const val):编译期就知道值,并且会把代码中所有对它的引用都替换成它的值。
var
const 只能修饰 val 不能修饰 var
常量这边,相对没什么特殊的。
二、分支表达式
- if表达式
- when表达式
- try..catch..
- 中缀表达式
if表达式
在kotlin中if语句不仅可以像java中那样来使用,还可以有返回值,所以我们可以直接接收一个if表达式的值
private const val SUPER_USER = 1
private const val COMM_USER = 2
fun main(args: Array<String>) {
val userRoleId = if(args.isNotEmpty() && args[0]=="admin"){
SUPER_USER
}else{
COMM_USER
}
println(userRoleId)
}
像上面这样,其中的变量userRoleId就可以直接声明成常量(val),如果在java中则不能这么做,需要声明一个 变量 userRoleId,然后再去走判断的逻辑,根据不同if分支逻辑赋值为相应的值。
when表达式
- when表达式可以看成是java中switch的加强版,更加简单暴力且支持任意类型
- when同if一样,也可以带返回值。(when类似java中switch,同样也可以作为表达式,每个分支最后一行作为表达式的返回值)
when表达式还检查条件提供的输入范围。 使用..(双点)运算符创建范围。in运算符用于检查值是否属于某个范围。
fun main(ar
我们来对比一下,java的switch和 kotlin的when
// java
public static void main(String args[]) {
int code = Integer.parseInt(args[0]);
String rankName;
switch (code) {
case 0:
case 1:
rankName = "冠军";
break;
case 2:
rankName = "亚军";
break;
case 3:
rankName = "季军";
break;
default:
rankName = "无";
}
System.out.println(rankName);
}
// kotlin
fun main(args: Array<String>) {
val code = Integer.parseInt(args[0])
val rankName: String
when (code) {
0,1 -> rankName = "冠军"
2 -> rankName = "亚军"
3 -> rankName = "季军"
else -> rankName = "无"
}
println(rankName)
}
.
返回值的例子
c = when(a){
0 -> 5
1 -> 10
else -> 0
}
. when还可以将条件转移到分支
c = when{
x is String -> x.length
x == 1 -> 100
else -> 0
}
try..catch..
try..catch..同样可以作为表达式
c = try {
a/b
}catch (e:Exception){
e.printStackTrace()
0
}
- when表达式还检查条件提供的输入范围
fun main(args: Array<String>){
var number = 7
when(number) {
in 1..5 -> println("Input is provided in the range 1 to 5")
in 6..10 -> println("Input is provided in the range 6 to 10")
else -> println("none of the above")
}
}
三、运算符与中缀表达式
中缀这个东西,场景相对少
中缀表达式,用于只有一个参数的场景,用infix修饰的函数
- 中缀表达式必须是扩展函数或方法;
- 中缀表达式只能有一个参数;
- 中缀表达式的参数不能有默认值(否则参数可能为空);
- 中缀表达式的参数不能是可变参数(否则参数可能不止一个)。
class Book(val name:String){
infix fun on(place:String){
print("《$name》放到${place}上了!")
}
override fun toString(): String {
return "我拥有《$name》这本书"
}
}
fun main(args: Array<String>) {
val myBook = Book("简爱")
println(myBook)
myBook on "桌子"
}
四、Lambda表达式
这个,就太多东西了。
在关于前2篇里面,有很多相关的内容。