目录
第一章
1.1、四大组件
1.2、Log日志工具
- Log.v() 用于打印最为繁琐,意义最小的日志信息,内容最详细,日志级别最低;
- Log.d() 用于打印调试信息,日志级别比Lod.v高一级;
- Log.i() 用于打印一些比较重要的数据,对应info,比debug高一级;
- Log.w() 用于打印一些警告信息,对应warm,比info高一级;
- Log.e() 用于打印错误信息,对应级别warm,比warm高一级
输出日志语法:
Log.d(tag, "msg")
第一个参数tag,用于对打印信息进行过滤;第二个参数msg,用于想要打印的内容。
第二章
2.1、变量
val 表示不可变的变量
var 表示可变的变量
val a = 10 // 声明一个不可变量10,kotlin类型推到机制,这里不用写Int,kotlin也能知道
当kotlin无法进行类型推导时,需要显式的声明变量类型。例如在对一个变量延迟赋值时,kotlin就无法自动推导它的类型,这时需要显式的声明:
val a : Int = 10
Kotlin数据类型:Int、Long、Short、Float、Double、Boolean、Char、Byte
2.2、函数
fun关键字定义方法。
语法规则:
fun methodName(param1: Int, param2: Int): Int {
return 0
}
参数的声明格式是“参数名:参数类型”,若不接收参数则直接用()
示例:
fun largerNumber(num1: Int, num2: Int): Int {
return max(num1, num2) // max()是kotlin的内置函数
}
fun largerNumber(num1: Int, num2: Int): Int = max(num1, num2)
fun largerNumber(num1: Int, num2: Int) = max(num1, num2)
2.3、逻辑控制
程序的执行语句主要分为3种:顺序语句、条件语句和循环语句。顺序语句即代码一行一行的往下执行。Kotlin的条件语句和循环语句大致同Java。
2.3.1、if语句
fun largerNumber(num1: Int, num2: Int): Int {
val value = if (num1 > num2) {
num1
} else {
num2
}
return value
}
简化:
fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) {
num1
} else {
num2
}
fun largerNumber(num1: Int, num2: Int) = if (num1>num2) num1 else num2
2.3.2、when语句
fun checkNumber(num: Number) {
when (num) {
is Int -> println("number is Int") // is关键字是类型匹配的核心
is Double -> println("number is Double")
else -> println("number not support")
}
}
fun getScore(name: String) = when {
name.startsWith("Tom") -> 86
name == "Jim" -> 77
name == "Jack" -> 95
name == "Lily" -> 100
else -> 0
}
2.3.3、for循环
for (i in 0..10) {
println(i)
}
for (i in 0 until 10 step 2) {
println(i)
}
2.4、类与对象
class 关键字创建类。例如: class Person{ }
val p = Person() //实例化Person
2.5、继承与构造函数
Kotlin中任何一个非抽象类(abstract)默认都是不可以被继承的。
open 在类前面加上open关键字表示这个类可以被继承。例如:open class Person { }
: 继承关键字。例如: calss Student : Preson() { }
constructor 声明一个次构造函数。
2.6、接口
interface 关键字定义一个接口。例如:interface Study{ }
实现接口也是用 :
函数的可见性修饰符:public、private、protected、internal。在Kotlin中public修饰符是默认项。
public 所有类可见(默认)
private 当前类可见
protected 当前类、子类可见
internal 同一模块中的类可见
2.7、数据类单例类
data 关键字定义一个数据类。例如:data class Num(val a: String, val b: Double)
object 关键字定义一个单例类。例如:object a{ }
单例类调用语法:类名.方法名() 例如:
object Singleton {
fun singletonTest() {
println("singletonTest is called.")
}
}
Singleton.singletonTest()
2.8、集合
List、Set、Map
listOf()表示创建一个不可变集合,mutableListOf()表示创建一个可变集合;
setOf()表示创建一个不可变集合,mutableSetOf()表示创建一个可变集合;Set集合不可以存放重复元素,是无序的。
mapOf()表示创建一个不可变集合,mutableMapOf()表示创建一个可变集合;Map是一种键值对形式的数据结构
2.8.1、集合的函数式API
Lambda表达式的语法结构:{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
需求:如何在一个水果集合里面找到单词最长的那个水果?
val list = listOf("Apple", "Banana", "Orange", "Pear")
var maxLengthFruit = ""
for (fruit in list) {
if (fruit.length > maxLengthFruit.length) {
maxLengthFruit = fruit
}
}
println("max length fruit is " + maxLengthFruit)
maxBy函数的工作原理是根据传入的条件来遍历集合,从而找到该条件下的最大值。简化:
val list = listOf("Apple", "Banana", "Orange", "Pear")
val maxLengthFruit = list.maxBy( { fruit: String -> fruit.length } )
当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号的外面,对此简化:
val maxLengthFruit = list.maxBy(){ fruit: String -> fruit.length }
如果Lambda参数是函数的唯一一个参数的话,还可以将函数的括号省略,对此进一步简化:
val maxLengthFruit = list.maxBy{ fruit: String -> fruit.length }
由于Kotlin的类型推导机制,Lambda表达式中的参数列表在大多数情况下不必声明参数类型,当Lambda表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用 it 关键字来代替:
val maxLengthFruit = list.maxBy{ it.length }
map函数,用于将集合中的每个元素都映射成一个另外的值,映射的规则在Lambda表达式中指定,最终生成一个新的集合。例如把集合中所有的水果名都变成大写:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val newList = list.map { it.toUpperCase() }
filter函数,过滤集合中的数据。可以单独使用,也可配合map函数一起使用。比如要保留5个字母以内的水果且水果名都要大写:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val newList = list.filter { it.length <= 5 } // 先过滤再转成大写提高效率
.map { it.toUpperCase() }
any函数用于判断集合中至少存在一个元素满足指定条件,all函数用于判断集合中是否有函数满足条件。
2.9、空指针检查
? 表示可为空
?. 表示对象不为空时正常调用,为空时则什么都不做。例:a?.doSomething()
?: 左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则返回右边表达式的结果。例: val c = a ?: b
let 处理全局变量的判空问题。语法如下:
obj.let { obj2 ->
// 编写具体的业务逻辑
}
2.10、字符串内嵌
字符串内嵌使用 $
语法:
"hello, ${obj.name}. nice to meet you!"
当只有一个变量时可以将两边的大括号省略:
"hello, $name. nice to meet you!"
2.11、函数的参数默认值
// 给str参数设置默认值hello
fun printParams(num: Int, str: String = "hello") {
println("num is $num , str is $str")
}
当出现类型不匹配时使用键值对传参
fun printParams(num: Int = 100, str: String) {
println("num is $num , str is $str")
}
fun main() {
printParams(str = "world")
}