【Android学习笔记】kotlin语法学习
知识点
- 小技巧
- 双击shift,输入待查询的类名,一般是以下划线开头的。比如_Arrays.kt
- kotlin中部分内容是直接引用的java的,比如HashMap等,具体有哪些,可以查看这个类:TypeAliases.kt
- 基本数据类型和空指针安全
//1.变量声明
// var test : Int = 200
// var test2 = 200
//2.数值类型:整型 同理Float Double
// Int Short Long 这三个都是空指针安全的类型 会映射成java的基本数据类型
//Int? Shor? Long? 可能为空 会映射成java的包装类
// var testInt : Int = 222
//3.不同数值类型的转换
//3.1 Int 转换成其他的类型
// var tInt2 : Int = 200
// var tDouble : Double=tInt2.toDouble()
// var tFloat=tInt2.toFloat()
// 4. Boolean 类型
// var tBoolean:Boolean=true
// println("aaa $tBoolean")
//5.null安全
// var str:String="99"
// var target = str.toIntOrNull()
// println(target)
//6.安全调用
// var b: String? = "aaa"
// println(b?.length)//返回null
// 6.1 elvis 操作符
// 当我们有一个 r 的可空引用时,我们可以说如果 r 不空则使用它,否则使用使用非空的 x :
// val l: Int = if (b != null) b.length() else -1
// val l = b?.length()?: -1
//7.三目运算符
// b?.let { print("let")}
// var c: Int = b?.length ?: 12 elvis操作符
// println(c)
// 8.区间运算符
// var range1: IntRange = 2 .. 10 //闭区间运算符
// var range1: IntRange = 2 until 10//半开区间运算符
// println(range1 is IntRange)
// for (v in range1) {
// println(v)
// }
// range1.forEach { println() }
针对?:运算符的解释:

- 数组和集合
2.1. 数组的遍历
//5.1 数组
var arr1 = arrayOf("peng", "lei", "gang")
var arr2 = arrayOfNulls<String>(3)
var v1: String? = "100"
var tar = v1?.length ?: -1
for ((index, value) in arr1.withIndex()) {
//脚标和值遍历
println("value2:$value")
}
for (item in arr1.indices) { //有序的集合都是可以通过indices来遍历的
//脚标遍历
println("value2:${arr1[item]}")
}
for(i in 0 until 3) {
println("value3:${arr1[i]}")
}
2.2. Set
//5.2 set
var set1 = hashSetOf("peng", "lei", "gang") //通过查看typealiases.kt得知,kotlin中的hashset就是java中的,增加了一个别名而已
//set的遍历
set1.forEach {
print("value : $it")
}
for (s in set1) {
print("value : $s")
}
for (index in set1.indices) {
}
2.3. list 和map类似
3 函数
3.1 函数的定义
fun 函数名(形参列表)[:返回值] {
//函数体
}
3.2 变参的函数
fun test2(tt : Int, vararg books: String) {
var testFun : (Int) -> String //函数类型 (Int) -> String
}
3.3 函数类型
var testFun : (Int) -> String //函数类型 (Int) -> String
3.4 持有一个函数的引用
fun test3() {
fun test2Obj(){}
val ab: () -> Unit = ::test2Obj //持有函数的引用
}
3.5 内联函数
- 关键字 online
- 简介:
//内联函数
inline fun map(data : Array<Int>, fn : (Int) -> Int) : Array<Int> {
xxxx
}
- 作用:减少函数的开销,比如上述代码,用inline修饰后,实际上只有一个函数,出入的函数会和原来的那个函数合并成一个
- 缺点:如果入参函数较大并且多次调用,会造成代码量很大
3.6 集合的函数式调用
有过滤,转换,聚合等操作符,类似rx
4 面向对象
4.1 类和对象
//定义类 构造方法没有任何修饰符时,可以省略 如果没有显式的构造方法,系统会自动定义一个。
private class Hello constructor(name:String){
}
//类的修饰符 private,public,internal,final,open,abstract 构造方法的修饰符:private,public,internal,protected,final,open,abstruct. 对于属性,是否使用访问控制符,效果是一样的
//属性的默认值: 定义属性时,或者构造方法中可以给默认值
fun main(args: Array<String>) { // 包级可见的函数,接受一个字符串数组作为参数
println("Hello World!") // 分号可以省略
var h:Hello?=Hello("sdfsf")
h?.say()
println("Hello World!222")
}
private class Hello (name:String){
var name="sdsd"
init{
this.name=name //init方法是为 Primary Constructor服务的,做一些初始化操作
}
fun say(){
//println("hahhah$name")
println(name)
}
}
//或者这样写
fun main(args: Array<String>) { // 包级可见的函数,接受一个字符串数组作为参数
println("Hello World!") // 分号可以省略
var h:Hello?=Hello("sdfsf")
h?.say()
println("Hello World!222")
}
private class Hello (name:String){
var name=name
fun say(){
//println("hahhah$name")
println(name)
}
}
//或者这样写
fun main(args: Array<String>) { // 包级可见的函数,接受一个字符串数组作为参数
println("Hello World!") // 分号可以省略
var h:Hello?=Hello("sdfsf")
h?.say()
println("Hello World!222")
}
private class Hello (var name:String){
fun say(){
//println("hahhah$name")
println(name)
}
}
4.2 方法
//引用类中的方法
var rn:(Dot)->Unit = Dot::run //方法类型:(Dot)->Unit
4.3 compontN 方法和结构
//非数据类需要自己去写解构方法
//数据类自动生成结构方法 、equals方法、copy等方法
4.4 导包并制定别名
import java.sql.Data as SData
5 面向对象

浙公网安备 33010602011771号