个人博客:haichenyi.com。感谢关注
自从18年上一家公司用kotlin做了项目之后,新公司就没有用过kotlin了,都快要忘完了,最近又想起来了,再捡了一下吧。
定义变量的方式
java:类型+变量名+值+逗号
int a = 5;
kotlin:var/val+变量名+(:类型)+值(ps:类型可省略)
var:可变变量(可以重新分配值)
val:只读变量(初始化的时候必须赋值,不能修改)
var c:int
c = 5
var c = 5
val b = 5
函数
java:public/private/protected+返回类型+方法名+括号参数+大括号方法体
public void add(int a ,int b){
}
public int add1(int a,int b){
return a+b;
}
kotlin:fun+方法名+括号参数+(:返回类型)+大括号方法体
返回类型Unit类型,对应java的void,即无返回值,可省略
fun add(a:int,b:int):Unit{
}
fun add(a:int,b:int){
}
fun add1(a:int,b:int):int{
return a+b
}
if表达式(java中三目运算符)
把a和b两个数中值大的赋值给c
java:三目运算符
int c = a > b ? a : b
kotlin:if表达式
val c = if( a > b) a else b
for循环
//java
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
for (int j = 0; j <= list.size(); j++) {
Log.v("wz", list.get(j));
}
//kotlin
val list = listOf("a","b","c","d")
for(item in list){
Log.v("wz",item)
}
//上面这个for循环等同于forEach
list.forEach{
Log.v("wz",it)
}
//上面两种循环拿不到下标
for(index in list.indices){
//美元符号的用法见后面
Log.v("wz","第$index 个item的值是${list[index]}")
}
//上面这种就可以拿到for循环的下标
//kotlin中String类型的变量也可以for循环遍历每一个char的值
美元符号($)
把$符号放在变量前面,输出的就是变量的值
val i = 3
Log.v("wz","i的值是:$i")
//输出的是:i的值是:3
Log.v("wz","i的值是:$3")
//输出的是:i的值是:$3
== 和 ===的区别
类似于java中的==和equals的区别
java:==判断值是否相等,equals判断物理地址是否相等
kotlin:==判断物理地址是否相等,===判断值是否相等
数据类型的转换:toInt(),toBoolean()等等
//java中不同数据类型的相互转换是强转
String s = "1";
int a = (int)s;
//kotlin中没有强转提供了转换的方法
var s = "1"
var a = s.toInt()
var a1 = s.toBoolean()
is运算符
个人觉得is运算符类似于java中的instanceof关键字
//java:判断某个变量是否是某个类型的
String s = "1";
if(s instanceof String){
}
//kotlin:判断某个变量是否是某个类型
var s = "1"
if(s is String){
}
//既然上面说了is是个运算符,运算符当然可以加非
if(s !is String){
}
空指针和lateinit
要明确一点:java中才会有空指针异常,kotlin中不存在空指针异常,因为它有非空判断机制
比方说,我们如果要在kotlin定义一个Bitmap变量,我们知道Bitmap是非常占内存的,用完之后我们要手动置空
在类型的后面加上问号,用的时候也要加问号才能用,表示不为空的时候才会往下走,如果为空就不会往下走了
var bitmap:Bitmap? = null
var w = bitmap?.width
那么,我们如果要定义一个不可能为空的对象怎么定义呢?
lateinit var bitmap:Bitmap
bitmap.width
黑科技:when表达式和Any(任意类型)
when表达式取代java中的switch,when的返回值依据每一个条件的返回值来定,可以返回任意类型,从上往下按顺序执行,else不能少
lateinit var obj : Any
var b = when(obj){
1 -> 2
is String -> 3
3,4 -> "obj等于3或者等于4"
in 10..20 -> "obj在10到20之间"
else -> true
}
比方说这里,先定义个可以是任意类型变量的的obj,如果传进来的是Int类型的1,则返回int类型的2。如果传进来的是String类型的变量,则返回int类型的3。其他,则返回boolean类型的true
when可以取代 if-else if链。如
val x = 10
when {
x < 10 -> "x小于10"
x in 10..20 -> "x在10到20之间"
x in 21..40 -> "x在21到40之间"
else -> "x大于40"
}
区间
顾名思义:在某个范围内
//等同于 x >= 1 && x <= 4(包括1,包括4),从1到4
x in 1..4 //1,2,3,4
//等同于 x >= 1 && x < 4(包括1,不包括4),从1到4
x in 1 until 4 //1,2,3
//包括1,包括4 ,从4到1
x in 4 downTo 1 //4,3,2,1
//从1到8,每隔两个循环一次,也就是1,3,5,7
i in 1..8 step 2
//从8到1,每隔两个循环一次,也就是8,6,4,2
i in 8 downTo 1 step 2
//从8到1,每隔两个,并且要满足能整除3的,这里就是6
i in (8 downTo 1 step 2).filter { it % 3 == 0 }
//上面的关键字filter,还有map等,用过RxJava的应该很眼熟
网友评论