主函数
fun main(args: Array<String>){
println("Hello World")
}
变量
1、常量
val修饰常量,编译器规定常量必须初始化,若不想初始化,可用**by lazy{}**对常量进行懒加载
val a: Int = 1 // 强类型常量
val b = 2 // 弱类型常量
const val c = "Hello" // 编译器常量
val a: String by lazy{"lazy init"} // 懒加载常量
2、变量
var修饰变量,编译器规定变量必须初始化,若不想初始化,可用lateinit关键字限制报错
lateinit var a //未初始化变量
var x = 5 //初始化变量
var x1 = "x is $x" //获取变量的值:$变量
var x2 = "${x1.replace("is","was")}" //内嵌表达式:${表达式}
var str = """ //段落
<html>
<a href="">go</a>
</html>
"""
3、空值检测
println(value?.size) //if not null
println(value?.size ?: "empty") //if not null and else
println(value.firstOrNull() ?: "") //if not null and get first
println(values["key"] ?: a + b) //if not null and else + 表达式
value?.let{ } //if not null + 代码块
value!!.let{ } //告诉编译器不需要判空
4、字符串比较
==:在kt中相当于java的equals()
===:在kt中相当于java的==
数组
1、定义
//每种基本类型都有对应的数组创建方法,类似于定制版
var array:IntArray = intArrayOf(1,3,5,7)
var array:CharArray = charArrayOf('H','E','L','L','O')
//基于泛性的创建方法,泛型也可省略,类似于通用版
var array:Array<Char> = arrayOf('H','E','L','L','O')
2、数组和字符串转换
//第一种形式
var array:Array<Char> = arrayOf('H','E','L','L','O')
println(array.joinInString(""))
//第二种形式
var array:CharArray = charArrayOf('H','E','L','L','O')
println(String(array))
3、数组遍历
var array:Array<Char> = arrayOf('H','E','L','L','O')
//第一种形式
array.forEach{println(it)}
//第二种形式
array.forEach{::println}
//第三种形式
for((index,value) in array.withIndex()){
println("$index -> $value")
}
函数
1、有返回值的函数
//第一种形式
fun sum(a: Int, b: Int): Int {return a + b}
//第二种形式
fun sum(a: Int, b: Int) = return a + b
//第三种形式
fun sum(a: Int, b: Int) = a + b
2、无返回值的函数
Unit类型相当于Void类型,Unit返回类型可以省略不写
fun printSum(a: Int, b: Int): Unit { …… }
3、默认参数的函数
fun foo(a: Int = 0, b: String = "") { …… }
4、变长参数的函数
变长参数由vararg关键字决定,数组参数可通过*方式传参,第一个参数可以不使用名字指定,最后个参数必须使用具名参数
fun say(double: Double,vararg ints: Int,string: String) { …… }
val array = intArrayOf(1,3,4,5)
say(2.0,*array,string = "Hi")
5、扩展函数
你可以给父类添加一个方法,这个方法将可以在所有子类中使用
fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
6、智能类型推测
判断一个对象是否为一个类的实例,可以使用is关键字与Java中的instanceof关键字类似,但在Kotlin中如果已经确定了一个对象的类型,可以在接下来的代码块中直接作为这个确定类型使用
fun getStringLength(obj: Any): Int? {
if (obj is String) {return obj.length} //类型判断后,obj会被系统自动转换为String类型
if (obj !is String){} //同时还可以使用!is,来取反
return null //代码块外部的obj仍然是Any类型的引用
}
7、复合函数
复合函数指的是函数中存在另一个函数,类似于数学的f(g(x))
infix fun <P1,P2,R> Function1<P1,P2>.andThen(function: Function1<P2,R>): Function1<P1,R>{