kotlin-books 个人学习笔记记录
后续一致更新笔记
- 1-1常量
- 1-2-变量
- 1-3.1数据类型
- 1-3.2类型安全
- 1-4.1-集合List
- 1-4.2-集合Set
- 1-4.3-集合Map
- 1-4-4集合数组
- 1-5-字符串操作
- 1-6-元组(Tuple)
- 1-7-可空类型
- 1-8-基础操作符
- 1-9控制流程
- 1-10函数
- 1-11Lambd和高级函数1
- 1-0概念
- 1-1类定义及构造器
- 1-2普通属性和组合属性
- 1-3方法
- 1-4函数覆盖重写
- 1-5可见性修饰符
- 1-6嵌套类&内部类
- 1-7数据类
- 1-8枚举类
- 1-9对象声明&表达式&伴生对象
- 1-10异常错误处理
- 1-11类型检查和转换
- 1-1 接口
- 1-2 接口属性
- 1-3 接口函数
- 1-4接口的实现&组合
- 1-5泛型约束
- 1-6泛型
- 1-7扩展
import com.sun.org.apache.xpath.internal.operations.Bool /** * * 数据类型 * Created by sungang on 2017/11/10. */ //********************************* Int 整数类型 ******************************************** var i : Int = 3 //或者 var i2 = 3 //可以省略 Int ,具有类型推断能力 java必须声明具体的类型 //********************************* Int 整数类型 ******************************************** //********************************* Double Float 浮点型 ******************************************** var pi : Double = 3.14 val oi2 = 3.14 val oi3 = 3.1 //********************************* Double Float 浮点型 ******************************************** //********************************* Boolean 布尔型 ******************************************** //表示逻辑上的 '真' 或 '假' //只有两个值 true 或 false var b : Boolean = true //********************************* Boolean 布尔型 ******************************************** fun main(args: Array<String>) { println(pi.javaClass) println(oi2.javaClass) println(oi3.javaClass) println(b) }/** * Created by sungang on 2017/11/10. */ fun main(args: Array<String>) { var str1 = "chengdu" var str2 = "chengdu" //比较 == equals println(str1 == str2) println(str1.equals(str2)) //忽略大消息 str2 = "CHENGDU" println(str1.equals(str2, true)) //字符串转整型:调用方法Integer.parseInt(***) //字符串转长整型:调用方法Long.parseLong(***) //字符串转浮点数:调用方法Float.parseFloat(***) //字符串转双精度数:调用方法Double.parseDouble(***) //字符串转布尔型:调用方法Boolean.parseBoolean(***) //字符串转字符数组:调用String对象的toCharArray方法 //字符串转整型:调用String对象的toInt方法 //字符串转长整型:调用String对象的toLong方法 //字符串转浮点数:调用String对象的toFloat方法 //字符串转双精度数:调用String对象的toDouble方法 //字符串转布尔型:调用String对象的toBoolean方法 //字符串转字符数组:调用String对象的toCharArray方法 }/** * * 集合数组类型 : 可重复有序 Array 索引从0 开始 * * 定义: Array<类型> 或 arrayOf(元素1, 元素2, 元素3) * * 大小固定 元素类型不可变 * * Created by sungang on 2017/11/10. */ fun main(args: Array<String>) { //地铁1号线: arrayOf("金融城","孵化园","锦城广场","世纪城","天府三街","天府五街") //创建数组 var no1stations = arrayOf("金融城","孵化园","锦城广场","世纪城","天府三街","天府五街","天府五街"); for (no1station in no1stations) { // println(no1station) } //创建一个有默认值的数组 var no1stationsNamePlacehloders = Array(5,{"占位符"}) for (no1stationsNamePlacehloder in no1stationsNamePlacehloders){ // println(no1stationsNamePlacehloder) } //创建1 - 10 数组 Array(10,{ i -> i + 1}) // i代表元素索引值 var oneToTen = Array(10,{ i -> i + 1}); for (i in oneToTen) { // println(i) } //获取数组元素计数 count ,是否为空 isEmpty() // println("元素个数:${oneToTen.count()}") // println("是否为空:${oneToTen.isEmpty()}") //获取数组元素值:数组[索引] 首个元素:数组.first 最后一个:数组.last // // println("oneToTen第一个元素:${oneToTen[0]}") // println("oneToTen第一个元素:${oneToTen.component1()}") // println("oneToTen第一个元素:${oneToTen.first()},最后一个元素:${oneToTen.last()}") //获取筛选后的数组.distinct() 或者 .toSet()转化为Set集合 // 天府五街 就会去重 适合数组去重 // var no1stationsNoRepeat = no1stations.distinct(); var no1stationsNoRepeat = no1stations.toSet(); for (s in no1stationsNoRepeat) { // println(s) } //数组切割sliceArray() var oneToTenSliceArray = oneToTen.sliceArray(2..5) for (i in oneToTenSliceArray) { println(i) } /** * mutableListOf() 或 MutableList<类型>(元素1,元素2,元素3) * 大小可变,类型不可变 */ var no1NewsStations = mutableListOf("金融城", "孵化园", "锦城广场", "世纪城", "天府三街", "天府五街"); //add 在末尾加元素 addAll添加另一个数组 no1NewsStations.add("华府大道") no1NewsStations.addAll(mutableListOf("四河","广都")) for(no1NewsStation in no1NewsStations){ println(no1NewsStation) } //remove removeAll removeAt no1NewsStations.removeAt(0) no1NewsStations.remove("广都") no1NewsStations.removeAll(no1NewsStations) } /** * * Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 * * 定义:setOf() 或 Set<类型>(元素1,元素2,元素13) * Kotlin没有专门的语法用来创建set,可以使用标准库中的方法, 比如setOf(),mutableSetOf()。 * * emptySet(): Set - 创建一个空的只读Set * setOf(vararg T): Set - 创建一个只读Set * mutableSetOf(vararg elements): MutableSet - 创建一个可变Set * * val size: Int - 集合中元素的数量 * fun isEmpty(): Boolean - 判断集合是否为空 * fun contains(E): Boolean - 判断集合中是否包含某一元素 * fun iterator(): Iterator - 返回该只读集合的元素的迭代器 * * Created by sungang on 2017/11/10. */ fun main(args: Array<String>) { var no1stations = setOf("天府广场","金融城", "孵化园", "锦城广场", "世纪城", "天府三街", "天府五街", "天府五街"); var no1stations2 = setOf("金融城", "孵化园", "锦城广场"); //2号线 1号线 换乘站点 var no2stations = setOf("天府广场"); //3号线 1号线 换乘站点 var no3stations = setOf("省体育馆"); // for (no1station in no1stations) { // println(no1station) // } //元素计数count() 是否为空 isEmpty() println("数量:${no1stations.count()}") println("是否为空:${no1stations.isEmpty()}") println("是否包含:${no1stations.contains("天府广场")}") //检查是否包含某个元素contains() 是否包含某个集合 println("是否包含元素[世纪城]:${no1stations.contains("世纪城")}") println("是否包含集合[no1stations2]:${no1stations.containsAll(no1stations2)}") //转化为数组toTypedArray var no1stationsArr = no1stations.toTypedArray(); // for (s in no1stationsArr) { // println(s) // } //集合之间的运算 intersect():交集,subtract():差集,union():并集,minus(): 补集,被操作类型无序是Set集合 //换乘站交集 println(no1stations.intersect(no2stations)) //差集 println(no1stations.subtract(no2stations)) //并集 println(no1stations.union(no2stations).union(no3stations)) //补集 println(no1stations.minus(no2stations)) /** * 转换为可变:MutableSet * */ var no1NewsStations = no1stations.union(no2stations).union(no3stations).toMutableSet(); no1NewsStations.add("倪家桥") var newStations = arrayOf("火车南站","高新站") no1NewsStations.addAll(newStations) //删除一个元素 no1NewsStations.remove("倪家桥") //删除一个集合 no1NewsStations.removeAll(newStations); }/** * * 集合类型:Map * * 无序可重复 类似于字典概念 不可变 * * key value * * Created by sungang on 2017/11/10. */ fun main(args: Array<String>) { //定义一个map 使用元组 形式 var ariPorts = mapOf<String, String>(Pair("1", "One"), Pair("2", "Two"), Pair("3", "Three")) // val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three") println(map.javaClass) println(ariPorts.javaClass) //元素计数size 是否为空isEmpty() println("ariPorts SIZE():${ariPorts.size}") println("ariPorts 是否为空():${ariPorts.isEmpty()}") //获取单个key 对应的value : get() println(ariPorts.get("1")) println(ariPorts["1"]) //所有key 对应的value for (v in ariPorts.values) { println(v) } for ((k,v) in ariPorts){ println("$k -> $v") } // // ariPorts.toMutableMap(); // ariPorts["1"] = "第一个元素" }/** * * List 数组变更 * * * * Created by sungang on 2017/11/10. */ fun main(args: Array<String>) { //定义List 默认不可变 var itemList = emptyList<String>() var itemList2 = listOf<String>("1", "2") //可变List var itemNewList = itemList.toMutableList(); // println("长度:${itemNewList.count()}") println("是否包含:${itemNewList.contains("1")}") println("是否为空:${itemNewList.isEmpty()}") itemNewList.add("1") itemNewList.add("2") itemNewList.add("2") println("是否包含:${itemNewList.contains("1")}") println("是否为空:${itemNewList.isEmpty()}") //获取第一个 println(itemNewList.first()) println(itemNewList[0]) //获取出现的位置 indexOf() println(itemNewList.indexOf("1")) //获取最后一次出现的位置 println(itemNewList.lastIndexOf("2")) //遍历 forEach itemNewList.forEach(::println) //for for (book in itemNewList) { println(book) } }/** * Created by sungang on 2017/11/10. */ fun main(args: Array<String>) { val a = 10 val b = 20 var max_0: Int = a /** * if */ if (a > b) { max_0 = a } else { max_0 = b } println("----------------------------------") println("max_0:$max_0") println("----------------------------------") //简便 作为表达式 var max_1 = if (a > b) a else b println("--------------") println("max_1:$max_1") println("--------------") //作为代码块 println("--------------") val max_2 = if (a > b) { println("Choose a") a } else { println("Choose b") b } println("max_2:$max_2") println("--------------") /** * When */ //when取代了C风格语言的switch。相较switch而言,when语句显得更加的强大,灵活性更好。 //传统用法 val x: Int = 10 when (x) { 9 -> println("x:${x + 10}") 10 -> println("x:$x") else -> print("x:$x") } //分支条件一致 when (x) { 0, 1 -> print("x == 0 or x == 1") else -> print("otherwise") } //使用任意表达式作为分支的条件 // when (x) { // parseInt(s) -> print("s encode x") // else -> print("s does not encode x") // } // // when (x) { // in 1..10 -> print("x is in the range") // in validNumbers -> print("x is valid") // !in 10..20 -> print("x is outside the range") // else -> print("none of the above") // } //作为表达式 // val hasPrefix = when (x) { // is String -> x.startsWith("prefix") // else -> false // } /** * For * * for (item in collection) * print(item) */ val items = listOf<String>("apple", "orange", "kiwi") // 1 for (item in items) println(item) // 2 for (index in items.indices) println("item at $index is ${items[index]}") // 3 for ((i, e) in items.withIndex()) println("item at $i is $e}") //步长循环 // forStepFizzBuzz() /** * while * dowhile */ var num = 1 var times = 0; var total = 0 while (total < 5050) { total += num num += 1 times += 1 } println("累计次数:${times}") while (total < 5050) { total += num num += 1 times += 1 if (total == 5050) break } /** * 返回与跳转 * continue * break * * 标签: * 在 Kotlin 中表达式可以添加标签,标签通过@结尾来表示,比如:abc@,fooBar@ */ //break val arraysA = listOf("A", "B", "C", "D") val arraysB = listOf(1, 2, 3, 4) for (itemA in arraysA) { for (itemB in arraysB) { if (itemB > 2) { break } println("itemB:$itemB") } if (itemA == "C") { break } println("itemA:$itemA") } //break和标签 loop@ for (itemA in arraysA) { var i: Int = 0 for (itemB in arraysB) { i++ if (itemB > 2) { break@loop } println("itemB:$itemB") } println("i:$i") println("itemA:$itemA") println("---------") } //continue for (itemA in arraysA) { var i: Int = 0 for (itemB in arraysB) { i++ if (itemB > 2) { continue } println("itemB:$itemB") } if (itemA == "C") { continue } println("i:$i") println("itemA:$itemA") println("---------") } //continue和标签 loop@ for (itemA in arraysA) { var i: Int = 0 for (itemB in arraysB) { i++ if (itemB > 2) { continue@loop } println("itemB:$itemB") } println("i:$i") println("itemA:$itemA") println("---------") } } fun forStepFizzBuzz() { for (i in 100 downTo 1 step 2) { println(fizzBuzz(i)) } } fun fizzBuzz(i: Int) = when { i % 15 == 0 -> "FizzBuzz" i % 3 == 0 -> "Fizz" i % 5 == 0 -> "Buzz" else -> "$i" }package com.william.kt.day1 import sun.security.provider.certpath.Vertex import java.util.* /** * * 函数 * Created by sungang on 2017/11/10. */ //1 函数声明 //2 函数的参数定义格式:name: type,参数间使用“,”分割,每个参数需要显式定义确定的类型: //3 返回“Unit”类型函数 void 若一个函数不需要返回任何有效值,那么它的返回类型为“Unit”。“Unit”类型只有一个值,即“Unit”。另,可以不显示返回Unit: //在kotlin中用关键字fun声明函数: fun max(a: Int, b: Int): Int { return if (a > b) a else b; } // 3 默认实参定义(Default Arguments) //参数可以设置默认值,该参数在使用的时候可以省略;可以减少重载的函数个数。 //语法:在类型类型后面使用“ = ”添加默认值: fun read(b: Array<Int>, off: Int = 0, len: Int = b.size) { } //4 命名参数(Named Arguments) fun reformat(str: String, normalizeCase: Boolean = true, upperCaseFirstLetter: Boolean = true, divideByCamelHumps: Boolean = false, wordSeparator: Char = ' ') { } fun reformat2(str, normalizeCase = true, upperCaseFirstLetter = true, divideByCamelHumps = false, wordSeparator = '_') { } fun printHello(name: String?): Unit { if (name != null) println("Hello ${name}") else println("Hi there!") } //效果一样 fun printHello2(name: String?) { if (name != null) println("Hello ${name}") else println("Hi there!") } /** * 单表达式函数(Single-Expression functions) */ fun double(x: Int): Int = x * 2 //缩写 编译器可以推断出返回值类型时,函数定义时的返回值类型也可以省略: fun double2(x: Int) = x * 2 /** * 显式返回类型(Explicit return types) */ /** * 可变参数数量(Variable number of arguments (Varargs)) * 在函数内部,被“vararg”修饰的参数实际上是一个数组(Array<out T>)。 * 一个函数,只能有一个参数可以使用“vararg”关键字修饰,一般放在最后一个参数 * 若不是最后一个参数,在使用时,其他的参数可以使用命名参数(Named Arguments) * 方式;或者函数有一个功能类型参数,可以在函数的后面定义一个Lambda表达式实现。 */ //使用“vararg”关键字修饰参数,即可定义为可变数量参数(一般是最后一个参数): fun <T> asList(vararg ts: T): List<T> { val result = ArrayList<T>() for (t in ts) // ts is an Array result.add(t) return result } //该函数可以接收不定个数参数: //val list = asList(1, 2, 3) // 调用一个“vararg”函数时,可以一个一个值使用,如“asList(1, 2, 3)”;也可以直接使用一个存在的数组数据,使用“*”关键字: val a = arrayOf(1, 2, 3) val list = asList(-1, 0, *a, 4) /** * 函数范围(Function Scope) * 在Kotlin中,函数可以定义为顶层(top leve),表示不需要一个类去持有该函数。另外,还可以定义为局部,如类的成员函数,扩展函数。 */ //1 局部函数(Local Functions) Kotlin支持局部函数,即在函数内部定义的函数: // 局部函数,可以访问外层函数的局部变量: //2 成员函数(Member Functions) 定义在一个类或对象中的,称为成员函数。 class Sample() { fun foo() { print("Foo") } } //3 泛型函数(Generic Functions) fun <T> singletonList(item: T): List<T> { // ... return listOf(); } //4 内联函数(Inline Functions) //5 扩展函数(Extension Functions) //高阶函数和Lambda表达式(Higher-Order Functions and Lambdas) //6 尾递归函数(Tail recursive functions) Kotlin支持尾递归函数,允许一些算法使用递归方式代替循环;而且不会有堆栈溢出的风险。使用“tailrec”关键字修饰,编译器可以优化递归,生成一个快速、高效的循环版本。 tailrec fun findFixPoint(x: Double = 1.0): Double = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x)) // 等同 private fun findFixPoint(): Double { var x = 1.0 while (true) { val y = Math.cos(x) if (x == y) return y x = y } } //使用“tailrec”修饰的尾递归函数需要满足下面几个条件: //1 函数体最后一行执行代码需要是调用函数本身。 //2 不能在递归的函数后面还有其他的代码。 //3 递归部分不能放到“try/catch/finally”中。 /** * 函数使用 */ fun main(args: Array<String>) { var max = max(1, 2); println(max) //成员函数,通过“.”方式访问: Sample().foo() //命名参数 可以通过该方式调用: reformat("哈哈") //当该函数的所有参数都没有设置默认值,则需要这样调用: reformat("哈哈", true, true, false, '_') reformat2("哈哈", wordSeparator = '_') }/** * * * * * Created by sungang on 2017/11/10. */ //Lambda表达式详细内容见“Lambda表达式”部分,这里先简要概述: //1 Lambda表达一般使用“{ }”包围。 //2 它的参数(如果有的话)在“->”前定义,参数类型可能是省略的。 //3 函数体跟在“->”后面 fun main(args: Array<String>) { //1 高级函数 map var ints = asList(1, 2, 3, 4, 5, 6, 7, 8) //可以这样调用,当只有Lambda表达式参数时,调用函数时后面的“()”也可以省略: val doubledList = ints.map { it -> it * 2 } // == ints.map { it * 2 } println(doubledList) //2 高级函数 filter var nums = asList(1, 2, 3, 4, 5, 6, 7, 8) var sum = 0; //筛选偶数 var c = nums.filter { it % 2 == 0 }.forEach { sum += it //偶数之和 println(sum) } // for (i in c) { // print(i) // } //3 高级函数 groupBy //4 高级函数 sortBy }