WANG KE

KE1221

Kotlin基础语法

Kotlin

安卓开发

变量声明

变量声明相关

常量(不可修改)

不可修改变量为 val

变量(可修改)

可修改变量为 var

方法

关键字为 fun

流程控制

流程控制

if else

1
2
3
4
5
// 可以返回值
fun testValue(a: Int, b: Int): Int = if (a < b)
b
else
a

when

1
2
3
4
5
6
// 类似js中 switch 用法 可以直接返回值
fun getNum(name: String) = when {
name == "a" -> 10
name == "b" -> 20
else -> 30
}

循环

多种循环方式

while

1
2
3
4
5
6
var s = 3
// 循环
while (s > 0) {
println(s.toString())
s -= 1
}

for in 循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 左右区间 0 - 10
for(i in 0..10) {
println("test for .. ->" + i.toString())
}

// 0-9 不包含 10
for(i in 0 until 10) {
println("test for until ->" + i.toString())
}

// 间隔 2
for(i in 0 until 10 step 2) {
println("test for step ->" + i.toString())
}

// 降序 间隔 2
for(i in 10 downTo 0 step 2) {
println("test for downTo step ->" + i.toString())
}

类 class

封装 继承 多态(接口)

关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private   // 只对当前类内部可见

public // 所有类可见(默认)

protected // 只对当前类和子类可见

internal // 只对同一模块中的类可见

object // 单例类

data // 数据类

open // 可被继承

interface // 接口

接口

1
2
3
4
5
6
7
8
9
// 接口
interface Study {
// 没有函数体 需要强制实现此接口 否则报错
fun readBook()
// 有函数体 不强制要求实现 使用默认逻辑
fun doHomework() {
println("default")
}
}

定义可被继承类

1
2
3
4
5
6
7
8
// 创建类 open 为可被继承 无参数可不写 ()以及其中的值
open class Person(val name: String, val age: Int) {

// 方法
fun each() {
println("name is " + name + ". age is " + age)
}
}

定义类 继承类 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 继承类 接口
class Student(val son: String, val grade: Int, name: String, age: Int): Person(name, age), Study {

// 次构造函数 两个值
constructor(name: String, age: Int): this("", 0, name, age) {}

// 次构造函数 空值
constructor(): this("", 0) {}

// 只对当前类内部可见
private fun log() {
println(son + " " + grade + " " + name + " " + age)
}

// 重新父类 或接口方法
override fun readBook() {
println(this.name + " is reading")
// 调用内部方法
this.log()
}
}

单例类

1
2
3
4
5
6
// 单例模式 全局只存一个
object Cont {
fun log() {
println("Cont ok" + this.name)
}
}

实例化类

1
2
3
4
5
6
7
8
// 四个值 实例化 主构造函数
val student = Student("son", 1, "wang", 12)

// 两个值 实例化 次构造函数
val student = Student("wang", 12)

// 空值 实例化 次构造函数
val student = Student()

数据类

使用关键字 data 声明数据类

会根据参数,自动生成 equals(),hashCode(),toString()等固定无实际逻辑意义的方法

1
2
3
4
5
6
7
8
9
// 关键字 data 如果没有逻辑处理 {} 可省略
data class Cellphone(val name: String, val price: Double)

// 实例化
val one = Cellphone("nokia", 12.98)
// 同样参数 再次实例化
val two = Cellphone("nokia", 12.98)
// 对比 结果 true
println("one equals two " + (one == two))

集合

get(index) 用于获取 list 指定下标值

List 集合

listOf

1
2
3
4
5
6
7
// 此形式定义 不可使用 .add 方式添加值
val list = listOf<String>("a", "b", "c")

// 循环
for(i in list) {
println(i)
}

mutableListOf

1
2
3
4
// 此形式可添加值
val mlist = mutableListOf<String>("e", "f", "g")
// 添加值
mlist.add("h")

Set 集合

底层使用 hash 映射机制存放数据,集合中的元素无法保证有序。

setOf

1
2
3
4
val setlist = setOf<String>("a", "b", "c")
for(i in setlist) {
println(i)
}

Map 集合

hashMapOf

1
2
3
4
5
6
7
8
9
10
// 定义初始值
val hmp = hashMapOf<String, Int>()

// 添加元素 值
hmp.put("a", 1)
// 推荐写法
hmp["b"] = 2

// 读取值
val num = hmp["b"]

mapOf

1
2
// 定义初始值
val maps = mapOf<Int, String>(1 to "a", 2 to "b")

mutableMapOf

1
2
3
4
5
// 初始值
val hsMap = mutableMapOf<String, Int>("a" to 1, "b" to 2)

// 新增值
hsMap["c"] = 3

集合 函数式 API

maxOf

1
2
3
4
5
6
7
8
// 定义集合
val list = listOf<String>("a", "ab", "abc")

// 获取最大长度 3
val n = list.maxOf {it.length}

// 获取最大长度的值 abc
val v = list.maxOf {it}

map

1
2
// 将上面list 每个值转换大写 ["A", "AB", "ABC"]
var m = list.map { it.uppercase() }

filter

1
2
3
4
5
// 过滤 length = 2 的值 ["ab"]
val n = m.filter { it.length == 2 }

// 链式操作 ["AB"]
.map {it.uppercase()}

any

判断集合中是否至少存在一个元素满足指定条件

1
2
// 结果为 true
val r = list.any {it.length == 2}

all

判断集合中是否所有元素均满足指定条件

1
2
// 结果为 false
val r = list.all {it.length == 2}

操作符

三元,非空,let,字符串拼接等…

?可为空 ?: 如果左侧有值使用左侧 否则使用右侧

1
2
// 默认所有参数不可为空 否则编译失败 使用 ?符号使参数或变量可为空
fun test(msg: String?): Int = msg?.length ?: 0

!! 非空断言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义变量
var cont:String? = "abc"

fun main() {
// 非空判断
if(cont != null) {
// 执行方法
val str = teNull()
println(str)
}
}

// 定义方法 如果cont后面不使用 !! 则无法编译通过 即便上面已做非空判断
fun teNull(): String = cont!!.uppercase()

obj.let

1
2
3
4
5
6
7
// 只判断一次 study是否为空 不为空 可安全调用其方法
fun doFun(study: Study?) {
study?.let {
it.readBook()
it.doHomework()
}
}

字符串拼接

1
2
3
4
var name: String = "wang ke"

// 类似js中 模板字符串 ${} 单变量可省略 {}
println("my name is $name")

函数默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 第二个参数默认值
fun testFun(str: String, num: Int = 100) {
println("str = $str num = $num")
}

// 调用可不传
testFun("abc")

// 第一个参数默认值
fun testFun(str: String = "hello", num: Int) {
println("str = $str num = $num")
}

// 指定参数
testFun(num = 12)

Android

权限

1
2
// 拨打电话权限
<uses-permission android:name="android.permission.CALL_PHONE" />

跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 显式跳转 SendActive 要跳转的class
val intent = Intent(this, SendActive::class.java)

// 携带参数 key value
intent.putExtra("EXT", "my_ext")


// 执行跳转 (无需返回值)
startActivity(intent)

// 期待返回值 1 唯一值 自定义
startActivityForResult(intent, 1)

// 监听返回值
verride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
// 固定语法
super.onActivityResult(requestCode, resultCode, data)
// 判断来源
when (requestCode) {
1 -> if(resultCode == RESULT_OK) {
// 取值
val myData = data?.getStringExtra("data")
Toast.makeText(this, "$myData", Toast.LENGTH_SHORT).show()
}
}
}

被跳转界面接收参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 定义类 继承activity
class SendActive: AppCompatActivity() {
// 创建事件
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 使用布局页面
setContentView(R.layout.send_layout)

// 获取携带参数 key
val value = intent.getStringExtra("EXT")
// 这里有个text标签 展示获取到的值
textView.setText(value)
// 点击事件
textView.setOnClickListener {
val intent = Intent()
// 定义返回值
intent.putExtra("data", "return msg")
// 执行
setResult(RESULT_OK, intent)
// 销毁当前页面
finish()
}
}
}