第一章:开始启程,你的第一行Android代码
1.日志工具的使用
Log.v():用于打印最为烦琐的,意义最小的日志信息。对应级别verbose,是Android日志中级别最低级的一种。
Log.d():用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别debug,比verbose高一级。
Log.i():用于打印一些重要的数据,这些数据应该是你非常想看到的,可以帮你分析用户行为的数据,对应级别info,比debug高一级。
Log.w():用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一些这些警告的地方,对应级别warn,比info高一级。
Log.e():用于打印程序中的错误信息,比如程序进入了catch语句中。当有错误信息打印出来的时候,一般代表你的程序出现严重的问题,必须尽快修复。对应级别error,比warn高一级。
第二章:探究新语言,快速kotlin入门
1.声明:var声明一个可变的变量,val声明一个不可变的变量(优先使用val来声明一个变量,当val没有办法满足需求时再使用var)
2.函数:fun 函数名(变量1:变量1类型,变量2:变量2类型 ......): 返回值类型(可选){}
3.if语句:相对于Java中的if多了一个额外的功能,可以拥有返回值,返回值就是if语句每一个条件中最后一行代码的返回值。
4.when语句:①也可以拥有返回值,when语句允许传入一个任意类型的参数,然后在when的结构体中定义一系列的条件,格式:匹配值 -> {执行逻辑}
②除了精确匹配外,when语句还可以进行类型匹配,其中is是类型匹配的核心,相当于java中的instanceof关键字。
5.for循环 ①区间 0..10表示[0,10]这个区间 0 until 10表示[0,10)
②格式for( 变量 in 区间)
6.继承 父类前加关键字open,子类就可以继承
(例:open fun Person{} fun Student :Person())
注意①Person后面要加上(),因为Student类的主构造函数在初始化的时候会调用Person的无参构造函数,即使是无参的情况下,()不能省略;
②父类中主构造函数有参数时,子类在继承时也需要加入相应的变量名和变量类型,父类只需要有变量名,不需要变量类型。
(例:open fun Person(val name:String){} fun Student(name:String) :Person(name))
③次构造函数用constructor关键字来定义
7.接口 接口中的函数不要求有函数体,用interface关键字声明,在类型实现接口的函数时,用override关键字进行声明
8.数据类:用于将服务器或数据库中数据映射到内存中,为编程逻辑提供数据模型的支持。在kotlin中,只需在一个类前面声明了data关键字,就表明你希望这个类是一个数据类,kotlin会根据主构造函数中的参数帮你将equals()、hashCode()、toString()等固定且无实际逻辑意义的方法自动生成。
9.集合 ①List集合:kotlin内置的listOf()函数可以简化集合的初始化写法
(例:val list = listOf("Appel","Orange","Banana"))
listOf()函数创建的是一个不可变的集合,可变集合使用mutableListOf()函数
②Set集合的用法和List集合的用法一样,不同在于Set集合中的元素无法保证有序
③Map集合:是一种键值对形式的数据结构,也可以使用mapOf()和mutableMapOf()
(例:val map = mapOf("Apple" to 1,"Orange" to 2,"Banana" to 3))
遍历(for((fruit,number) in map))
10.集合的函数式API :语法结构:{参数名1:参数类型,参数名2:参数类型 -> 函数体}
(例:val maxlengthFruit = lsit.maxBy({fruit:String -> fruit.length}))
简化:①kotlin规定,当Lambda参数是函数的最后一个参数时,可以将API表达式移到函数括号的外面
(例:val maxlengthFruit = lsit.maxBy(){fruit:String -> fruit.length})
②如果Lambda参数是函数的唯一一个参数的话,可以将函数的括号省略
(例:val maxlengthFruit = lsit.maxBy{fruit:String -> fruit.length})
③Lambda表达式的参数列表大多数情况下不必声明参数的类型
(例:val maxlengthFruit = lsit.maxBy{fruit-> fruit.length})
④当lambda表达式的参数列表只有一个参数时,也不必声明参数名,可以用it关键字来代替
(例:val maxlengthFruit = lsit.maxBy{ it.length })
11.空指针检查 ①可空类型:在类名的后面加上一个问号
{例:Int表示不可空,Int?表示可空}
②判空辅助工具:?. 和 ?:
(例:fun getTextLength(text:String?) = text?.length ?: 0)
首先由于text是可空的,因此我们在调用它的length字段时需要使用 ?. 操作符,当text为空时,text.length会返回一个null值,这时借助 ?: 操作符让其返回0
③非空断言工具 !!,在对象的后面加上 !!,这是一种风险写法,意在告诉kotlin,我确信这里不为空,不用进行空指针检查,若出现问题,直接抛出异常,我自己承担后果。
④let函数:提供了函数式API的编程接口,将原始调用对象作为参数传递到lambda表达式中
{例:obj.let{obj2 -> (具体的业务逻辑)}}
let函数是可以处理全局变量的判空问题
12.字符串内嵌表达式:用${},当表达式中仅有一个变量时,大括号也可以省略
{例:"Hello,${obj.name}"} --->{"Hello,$name"}