Kotlin语⾔⼊门学习(⼀)
Kotlin是⼀种静态语⾔,该语⾔可在Java虚拟机(JVM)上运⾏,并可被编译成JavaScript源程序,Kotlin语⾔在使⽤时可直接调⽤Java 类库,并具有与Java程序进⾏互操作的能⼒。
Kotlin语⾔具有简洁、安全、⽀持跨语⾔互操作等技术特征,本⽂主要从基本语法、⽅法与Lambda表达式、类与对象、泛型等反⾯进⾏基本说明,偏重讲与Java语⾔不同的地⽅,建议有Java语⾔基础的同学学习。
本篇内容有所精简,阅读时如果感到有所跨越,可以阅读第⼆篇进⾏补充
⼀、基本语法
1.1基本数据类型
Kotlin语⾔⽀持的基本数据类型包含数字型、布尔型、字符和数组。
1.1.1数字:
Kotlin内置的数字类型有:Double、Float、Long、Int、Short、Byte
对于⼗六进制的数字,格式为0x数字,如:0xFF
对于⼆进制整数,格式为0b数字,如:0b001
Kotlin⽀持以下划线来分割数字,如:1_2345_6789
1.1.2类型转换
Kotlin程序中,位数短的数据类型不能直接转换成位数长的数据类型(与Java有区别)
不同类型的数字,可以使⽤toXXX()进⾏转换,如:转换为字节型10.toByte(),转换为字符Char()
1.1.3数学运算
除基本的+,-,*,/,%(求模),Kotlin语⾔中的*运算符还可作为传值符号,⽀持将⼀个数组赋值给⼀个包含可变长输⼊参数的⽅法
位运算
shl(bits),类似于Java的<<;运算
shr(bits),类似于Java的>>运算
ushl(bits),类似于Java的<<<;运算
ushr(bits),类似于Java的>>>运算
and(bits),位上的和
or(bits),位上的或
xor(bits),位上的异或
inv(),位上取反
1.1.4字符
Kotlin语⾔中,字符使⽤类型声明符Char进⾏说明,字符数据必须使⽤单引号来表⽰
var c: Char = 'a'    表⽰将字符'a'赋值给变量c
1.1.5数组
Kotlin中创建数组使⽤arrayOf或arrayOfNulls⽅法
var s1: Array<String> = arrayOf("a","b","c")
var s2: Array<String?> = arrayOfNulls<String>(2)        //s2为⼀个长度为2的空字符串数组
Kotlin程序在声明变量时,如果变量类型后使⽤了符号"?",则表⽰该变量可为空,否则,表⽰不能为空
Kotlin中还定义了特定数组类,如ByteArray、ShortArray等
数组初始化可基于“⼯⼚函数”实现
var ins = Array(5,{i->i+1})
Array语句第⼀个参数5表⽰数组长度,第⼆个参数{i->i+1}为⼀个⼯⼚函数,表⽰将元素索引值加1,并将值设置为数组中对应元素的值,以上数组元素为1,2,3,4,5
1.1.6字符串
Kotlin中的字符串可使⽤模板表达式,基本格式为$标识名
val i = 9
val s = "$i is in the string"                //$i为⼀个模板表达式
val s1 = "\'$s\'.length is ${s.length}"          //$s和${s.length}为模板表达式
上述语句执⾏后,$i显⽰9,${s.length}显⽰18
1.1.7数据类型的检查和转换
数据类型检查使⽤操作符is或!is,如:检查变量a是否为⼀个整型时,使⽤if(a is Int){...},空值的⽐较⽤==
类型转换使⽤操作符as,当变量a为null时,var b:Int = a as Int为不安全转换,可使⽤var b:Int? = a as Int?进⾏控制。另外,可使⽤as?进⾏安全转换
1.2程序的控制结构
Kotlin程序中的控制结构包含if,when,for,while,其中,if和when可作为表达式直接使⽤
var value = if (a>b) {a} else {b}
when结构
when(变量){
值1 ->语句1
值n ->语句n
}
类似于Java中的ase语句
1.3集合类型
除数组结构外,Kotlin中的集合类型包含列表List,集合Set,字典Map等;Kotlin中,集合类型分为可修改和只读两种
Kotlin中,只读列表基于List<T>接⼝定义,可修改列表基于MutableList<T>定义;类似,Set<T>为只读集合,MutableMap<K,V>为可修改字典等
初始化集合类型时,推荐直接调⽤系统提供的标准⽅法:listOf,mutableListOf,setOf,mutabeSetO
f,mapOf,mutableMapOf 等。复制⼀个集合类型的数据,可使⽤的⽅法为toMap,toList,toSet等
1.4数值范围
Kotlin可直接使⽤数值表达式:..(两个点),如:1..10表⽰范围1⾄10(整数)
在for循环中,使⽤for(i in 1..10)或for(i in 10 downto 1)
也可控制步长,for(i in 1..10 step 2),表⽰从1开始,每次前进2步,⾄10终⽌
不需要使⽤某个范围的终⽌值时,可使⽤until,如:for(i in 1 until 10)  表⽰数值范围从1开始,⾄9终⽌
1.5等式
mutable是什么意思Kotlin可使⽤两种等式运算符:===和==
==⽤于值或结构相等关系的判断,===⽤于应⽤对象相等关系的判断
1.6操作符
除常规操作符外,Kotlin还有在范围中进⾏查询或遍历的in操作符:in和!in
⼆、⽅法与Lambda表达式
2.1⽅法
fun ⽅法名称(参数列表): 返回值类型{
//执⾏语句
return 返回值
}
参数列表中参数声明的基本格式为“参数名:参数类型”。当⽅法没有返回值时,返回值类型可省略
当⽅法中的程序相对简单,仅包含计算表达式,并将计算结果返回时,可使⽤以下简化格式:
fun ⽅法名称(参数列表) = 计算表达式,如:fun add(a:Int, b:Int = 10) = a+b    //b指定了默认值
Kotlin中的⼀个⽅法只能包含⼀个变长参数,⽽且该变长参数只能位于⽅法定义中参数列表的末尾。变长参数需使⽤关键字vararg,如:vararg vs:Array<Int>表⽰vs是⼀个接收多个整型的参数
另外,当某⼀⽅法定义时满⾜了3个条件:定义时使⽤了infix关键字,⽅法只有⼀个输⼊参数,⽅法是类成员(或类的扩展⽅法),则该⽅法可以中缀⽅式使⽤,基本结构为:类实例 ⽅法名 参数。
如:下述程序运⾏的结果会在输出窗⼝中显⽰“string-sub”:
infix ds(str:String):String{
String() + str
}
fun main(args:Array<String>){
val s = "string"
val ss = s extends "-stub"
println(ss)
}
2.2⽅法的声明与使⽤
⼀个⽅法的使⽤是通过⽅法名来实现的。在使⽤⼀个⽅法时,还需要指定该⽅法的输⼊参数,如:add(2,3)为add函数的⼀种使⽤。
下列程序展⽰了本地⽅法的声明和使⽤(程序中,increase是本地⽅法,程序运⾏结果为6):
fun add(a:Int,b:Int):Int{
fun increase(c:Int):Int{
return c+1
}
return increase(a+b)
}
fun main(args:Arrat<String>){
println(add(2,3))
}
2.3Lambda表达式和⾼阶⽅法
Lambda表达式是⼀种匿名⽅法的表⽰⽅式。Lambda表达式⼀般使⽤箭头来表⽰⼀个运算操作,该操作分为3个部分:箭头,箭头左边,箭头右边。其中,箭头⽤于表⽰⼀个映射,箭头左边是映射的输⼊参数列表,箭头右边为映射的输出。
如:{x:Int,y:Int ->x+y},该运算有两个输⼊整型参数x和y,⽽运算结果(输出)为x+y。此外,Lambda表达式在声明时需要使⽤花括号,即{}
Lambda可被⽤于赋值给⼀个常量或变量,如:val add = { x:Float,y:Float -> x+y},这样,add实际上可被看作⼀个⽅法,该⽅法有两个输⼊参数x和y,输出x+y,使⽤时为add(0.1f,0.2f)。
⽅法声明也类似,箭头左边是输⼊参数类型列表,右侧为输出类型,如:(Int,Float) ->Float,该表达式表⽰⽅法的两个输⼊参数为Int和Float,输出参数类型为Float。⽅法不使⽤花括号
⽅法类型可看成是⼀种数据类型,并⽤于声明常量或变量。如:val calc:(Int,Float) ->Float = {x:Int,y:Float ->x*y},此例中,calc实质上是⼀个类型为(Int,Float) ->Float的运算,⽽具体的实现则被定义为{x:Int,y:Float ->x*y}。
在Kotlin中,所谓⾼阶⽅法是指⽅法中的参数是⽅法,或者⽅法的返回值是⽅法。如,在下列程序中,
calc1和calc2为⾼阶⽅法:
fun main(args:Array<String>){
fun calc1(n:Int,f:(Int) ->Int):Int{
return f(n)
}
println(calc1(10,{it+1}))
println(calc1(10,{i ->i-1}))
fun calc2(n:Int,fn:Float,f:(Int,Float) ->Float):Float{
return f(n,fn)
}
println(calc2(10,0.2f,{i:Int,f1:Float ->i*f1}))
}
2.4匿名⽅法和闭包
除了Lambda表达式可⽤来定义匿名⽅法外,匿名⽅法还可直接被定义,如:
fun (x:Int,y:Float):Float = x*y
fun(x:Int,y:Float):Float{
return x*y
}
匿名⽅法和Lambda表达式可访问它们的闭包,也就是说可访问外部范围的变量。下列程序展⽰⼀种简单的闭包访问(结果为101):
fun main(args:Array<String>){
var n = 100
fun p(){
n = n+1
}
p()
println(n)
}
上述程序中n可被看成⼀个main⽅法范围内的公共变量,⽽⽅法p与n在同⼀个⽅法内,所以该⽅法可以直接访问n,并进⾏计算。基于上述程序,⼀个闭包还可以这样使⽤:
val print = println("testing")
fun main(args:Array<String>){
print
}
上述程序将print定义为⼀个语句,然后再main中直接调⽤,程序运⾏结束,输出窗⼝会输出“testing”。程序中print和main在同⼀个⽂件内,所以print可被视为⽂件内的公共变量,⽽main⽅法可直接使⽤print。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。