Kotlin笔记01(变量,函数,逻辑控制)

  1. 1. Kotlin简介
  2. 2. 第一个HelloKotlin
  3. 3. 变量和函数
    1. 3.1. 变量
    2. 3.2. 函数
    3. 3.3. 逻辑控制
      1. 3.3.1. if条件语句
      2. 3.3.2. when语句
      3. 3.3.3. 循环语句

​ 写过Android的童鞋,应该都听说过kotlin,谷歌也是极力推荐使用kotlin来写Android。kotlin有着很多的优点,比如:代码精简,空指针异常判断,协程的优势等等。我是看了郭霖大佬《第一行代码Android》第三版之后,当初笔记是写在代码里的,现在把代码重新梳理一遍,写到博客里,顺道照着书再复习一遍Android和kotlin。虽然很多公司仍然用的java写的Android,但是技多不压身嘛嘻嘻。这个笔记只是记录kotlin相关的学习。

Kotlin简介

  1. kotlin是jetBrains公司开发与设计的,因此现在IntelliJ IDEA本身就加入了kotlin支持。

  2. kotlin和java是可以共存的,像Android当中,可以同时拥有.kt文件也可以有.java文件,为什么呢?

    • 首先先搞明白java是 编译型语言 还是 解释型语言。虽然java是先编译后运行,但是他并不是编译型语言。因为java编译之后生成的是class文件,class文件则是放入java虚拟机识别,虚拟机担任的是解释器的角色,class文件解释成二进制数据让计算机执行

    • java虚拟机只是与class文件打交道,它不关心class文件是哪里来的,因此java与kotlin共存的原理也就了解了,不论是java还是kotlin他们编译生成的文件都是class文件。

第一个HelloKotlin

1
2
3
fun main(){
println("Hello Kotlin")
}

首先安装IDEA,这个直接官网下载就可以了。打开IDEA ,File->new Project,选择Kotlin,然后next,写项目名称,然后finish就可以啦。在项目目录下,src右击-> New -> Kotlin file/Class,填写文件名字,类型选择File即可。然后输入以上代码,第一个Hello Kotlin就ok了

变量和函数

变量

kotlin的变量和java有很大的不同,java中定义变量需要具体声明变量类型,而kotlin只有两种val和var。因为kotlin拥有很优秀的类型推导机制。

1
2
3
4
5
6
7
//Kotlin

//val -> java中的final变量,不可变量
//var -> java中的非final变量,可变量
//永远优先使用val,val无法满足需求的时候再改var
val a = 10 //相当于java的 final int a = 10;
var b = 11 //相当于java的 int a = 10;

注意: kotlin代码是不用写分号的,其实写了也没关系,编译器直接无视掉了

kotlin的类型推导也不总是正常工作的,比如某个变量需要延迟赋值的话仍然需要显示声明变量类型才可以

1
lateinit var a : String

注意:永远优先使用val,val无法满足需求的时候再改var。

在java中除非主动设定final,否则这个变量一直是可变的。当项目变得复杂的时候,永远不知道这个变量什么时候被谁改掉了,容易导致各种问题,kotlin强制要求必须让开发者主动声明变量是否可变。

函数

1
2
3
fun methodName(a : Int, b : Int) : Int{
return a + b
}

语法规则: fun 方法名(参数) : 返回值类型{}

参数格式:参数名:参数类型

无返回值就不写返回值类型,不用写return。

语法糖:

1
2
3
//语法糖,当函数中只有一行代码时,可以省去return,用=代替,返回值类型也可省去,kotlin推到机制即可推导出类型
fun largerNum2(p1 : Int,p2:Int)= max(p1,p2)
fun largerNum3(p1:Int,p2:Int)=if (p1 > p2) p1 else p2

这也是我比较喜欢kotlin的一方面,可以少写很多东西(o゚▽゚)o ,越往后学,就会发现很多看起来很复杂的代码,改到kotlin当中,轻轻松松没几行就完成了。

逻辑控制

if条件语句

kotlin的条件语句有两种实现方式 if 和 when

kotlin的if和java的基本没区别

1
2
3
4
5
6
7
8
9
fun largerNum(num1:Int,num2:Int):Int{
var value = 0
if(num1 > num2){
value = num1
}else{
value = num2
}
return value
}

Kotlin的if语句相比java还有一个额外的功能,他是可以有返回值的

1
2
3
4
5
6
7
8
fun largerNum(num1:Int,num2:Int):Int{
var value = if(num1 > num2){
num1
}else{
num2
}
return value
}

if语句将每个条件的最后一行代码作为返回值,并将返回值赋值给了value变量。最终将value变量返回。当然以上代码还可以更加精简。

1
2
3
4
5
6
7
fun largerNum(num1:Int,num2:Int):Int{
return if(num1 > num2){
num1
}else{
num2
}
}

继续简化

1
2
3
4
5
6
fun largerNum(num1:Int,num2:Int)=if(num1 > num2){
num1
}else{
num2
}
fun largerNum(num1:Int,num2:Int)=if(num1 > num2) num1 else num2

是不是觉得kotlin的简化爽的一批。。。

when语句

会java的同学,应该了解switch语句吧,非常不好用,只能传整型变量最为条件,一个一个case比对,还必须每个case写break,十分不爽。那么看了kotlin的when语句解决了以上问题

写个例子:输入学生姓名,返回对应的成绩分数

1
2
3
4
5
6
7
8
9
fun getScore(name:String)=if (name == "Tom"){
86
}else if(name == "Jim"){
77
}else if(name == "Jack"){
95
}else{
0
}

上面使用了if判断学生姓名,返回分数,用了很多if,else,这个时候就可以考虑使用when了

1
2
3
4
5
6
fun getScore(name : String)=when(name){
"Tom" -> 86,
"Jim" -> 77,
"Jack" -> 95,
else -> 0
}

清清爽爽,而且when语句和if一样也是可以有返回值的,因此也可以用语法糖。

when语句可以使用任意类型的参数,包括类型匹配

1
2
3
4
5
6
7
//when的类型匹配
//is关键字是匹配核心,相当于java中的Instanceof
fun checkNumber(num:Number)=when(num){
is Int -> println("is Int")
is Double -> println("is Double")
else -> println("number not support")
}
1
2
3
4
5
6
7
8
9
//when的不带参数用法
//判断字符串或对象是否相等可以用 ==,不像java需要用equals(),===可以用来匹配是否是同一个对象
//比如需要这种只要以Tom开头的人,都取86分,就需要when的不带参数用法
fun getScore3(name:String)=when{
name == "Jim" -> 77
name.startsWith("Tom") -> 86
name == "Jack" -> 95
else -> 0
}

循环语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//kotlin的while和java的while没有任何区别
//for-i用法被舍弃,for-each用法被加强变为for-in循环
fun forin(){
//..是创建两端闭区间的关键字,创建一个[0,10]的区间
val range = 0..10
for(i in range){
//println(i)
}

//until创建一个左闭右开的区间 [0,10)
val range2 = 0 until 10

//默认情况下是区间内递增1,相当于for-i中的i++
//step关键字设定递增数量,step 2相当于 i = i + 2
for(i in 0 until 10 step 2){
//println(i)
}
//创建降序区间
for(i in 10 downTo 1){
println(i)
}
//Kotlin的强转是 as\

}