Kotlin入门
- 定义函数
- 定义局部变量
- 使用类型转换和自动类型转换
- 使用when表达式
- 惯用法
定义函数
//a ,b为Int值,返回值也会Int类型
fun sum(a:Int,b:Int):Int{
return a+b
}
//函数表达式作为函数体,返回类型,自行判断
fun sum(a:String,b: Int) = a+b
//Unit代表无返回值,可以省略
fun printSum(a: Int, b: Int):Unit{
print(a+b)
}
定义变量
// val 一次性赋值(只读)的局部变量
val a:Int = 1
val c = 1 //变量自动判断类型
val b : Int //没有初始化语句,必须明确指定类型
b = 1 // 明确赋值
// var 值可变的变量
var x = 5
x+=1
使用条件表达式
fun max(a: Int, b: Int){
if(a>b){
print(a)
}else{
print(b)
}
//以表达式的形式使用
fun max(a:Int, b: Int) = if(a>b) a else b
使用类型检查和自动类型类型转换
fun getStringLength(obj: Any):Int?{
if(obj is String){
//在这个分支中,'obj'的类型会被自动转换为String
return obj.length
}else{
//在分之外,'obj'的类型依然为Any
return null
}
}
使用for循环
fun loop(arr: Array<String>) {
//第一种
for(a in arr){
print(a)
}
//第二种
for(i in arr.indices){
print(arr[i])
}
}
使用while循环
fun loop(arr: Array<String>) {
var i = 0
while (i<arr.size){
print(i++)
}
}
使用when表达式
fun cases(obj: Any) {
when (obj) {
1 -> print("1")
is String -> print("String")
is Long -> print("Long")
!is String -> print("Not String")
else -> print("Unknown")
}
}
使用范围值
//使用in运算符检查一个数值是否在范围中
if(x in 1..y-1){
print("OK")
}
//检查是否在某个范围之外
if(x !in 0..arr.size){
print("Out")
}
//进行迭代
for(x in 1..5){
print(x)
}
使用集合
//在集合中进行迭代
for(name in names){
println(name)
}
//使用in运算符检查一个集合中是否包含某个对象
if(text in names){
print("Yes") // 将会调用name.contains(text)的方法
}
//使用lambda表达式,对集合中的元素进行过滤和变换
names
.filter{it.startsWith("A")} //过滤出以"A"开头的元素
.sortedBy{it} //排序
.map{it.toUpperCase()} // 全部变成大写
.forEach{print(it)} // 循环输出
惯用法
创建 DTO 类(或者叫 POJO/POCO 类)
data class Customer(val name: String, val email: String)
以上代码将创建一个 Customer 类, 其中包含以下功能:
所有属性的 getter 函数(对于 var 型属性还有 setter 函数)
equals() 函数
hashCode() 函数
toString() 函数
copy() 函数
所有属性的 component1() , component2() , … 函数
对函数参数指定默认值
//可以通过传入参数改变默认值
fun foo(a: Int = 0, b: String = "") { ... }
过滤list中元素
var list = arrayListOf<Int>()
list.add(1)
list.add(2)
list.add(3)
//过滤list中的元素
var positives = list.filter { x-> x>2 }
//更简便的写法
var positives = list.filter { it > 2 }
positives.forEach{ print(it)}
字符串中加入变量值
//$加上变量名
println("Name $name")
类型实例检查
when (x) {
is Foo -> ...
is Bar -> ...
else -> ...
}
使用成对变量来遍历 Map, 这种语法也可以用来遍历 Pair 组成的 List
//定义只读集合,不能添加
val map = mapOf("a" to 1, "b" to 2, "c" to 3)
for ((k, v) in map) {
println("$k -> $v")
}
//访问Map
println(map["key"])
map["key"] = value
延迟属性
val p: String by lazy {
// 计算该字符串
}
拓展函数
//类名加方法名
fun String.spaceToCamelCase() { ... }
//如果类中已经有此方法,拓展名和方法名相同时候
class Person{
fun walk(){
print("fly")
}
}
fun Person.fly(){
print("walk")
}
//当调用此方法时,调用的是成员函数而不是拓展函数
Person().fly()
If not null 缩写
val files = File("Test").listFiles()
println(files?.size)
//If not null and else 缩写
val files = File("Test").listFiles()
println(files?.size ?: "empty")
//当值为 null 时, 执行某个语句
val data = ...
val email = data["email"] ?: throw IllegalStateException("Email is missing!")
//当值不为 null 时, 执行某个语句
val data = ...
data?.let {
print("不为空") // 这个代码段将在 data 不为 null 时执行
}
在函数的 return 语句中使用 when 语句
fun transform(color: String): Int {
return when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
}
将 ‘if’ 用作一个表达式
fun foo(param: Int) {
val result = if (param == 1) {
"one"
} else if (param == 2) {
"two"
} else {
"three"
}
}