全部文章
最新文章
-
Android kotlin学习笔记(二)
集合 fun main(args: Array<String>) { val list1 = listOf("asd", "as", "ujkl") //安全操作符 list1.getOrElse(100){"asd"} println(list1.getOrNull(100) ?: "121") //可变的集合 val list2 = mutableListOf("asd", "as", "ujkl") //常见操作 list2.add("asdasd") list2 += "sas" list2.remove("asd") list2 += "uij" list2.removeIf { it.contains("a") } //list跟mutable相互转换 listOf("asd", "as", "ujkl").toMutableList() mutableListOf("asd", "as", "ujkl").toList() //遍历 for (s in list2) { println(s) } list2.forEach { println(it) } list2.forEachIndexed{ index, item -> println("$index, $item") } //set val set1 = setOf("asd", "as", "ujkl") //取出元素 println(set1.elementAt(1)) val set2 = mutableSetOf("asd", "as", "ujkl") //list转set list1.toSet() //直接去重,不需要转set list1.distinct() //kotlin提供现成的数字list var a = intArrayOf(1,2,33) var b = longArrayOf(1L) doubleArrayOf() shortArrayOf() byteArrayOf() floatArrayOf() booleanArrayOf() arrayOf<String>() listOf(1,2,3).toIntArray() //map var map = mapOf("a" to 1, "b" to 2, "c" to 4) //map获取值的方式 println(map["a"]) println(map.getValue("a")) //默认值方式 println(map.getOrElse("asd"){2323}) println(map.getOrDefault("asd", 0)) //map遍历 map.forEach{ println("$it.key,$it.value") } map.forEach{(key : String, value : Int) -> println("$key,$value") } val map2 = mutableMapOf("a" to 1, "b" to 2, "c" to 4) map2 += "o" to 1 map2.put("d", 1) //如果没有就新增 map2.getOrPut("sdasd"){111}}类基本定义class TextByClass{ //属性除非可空,不然必须要给值 //自动生成get/set //可生成get/set时进行操作,必须紧跟属性后面,如果只读可加private var a = "" get() = field.capitalize() private set(value) { field = value.trim() } var b = 1 get() = field.plus(1) set(value) { field = value.div(2) } //不校验空 var c : String ?= "asd" //延迟初始化,用到的时候才会初始化 lateinit var d: String //惰性初始化,首次用的时候才初始化 val config by lazy { lazyText() } private fun lazyText() { println("asd") }}/** * 执行顺序,主构造函数,类定义,init构造函数,次构造函数 */class Payer ( //主构造函数,临时变量用下划线 _id : Int = 1, _name : String, var text : String?){ //次构造函数 constructor(name : String) : this(text = "1", _name = name, _id =1) constructor(name : String, id : Int) : this(text = "1", _name = name, _id = id) { this.name = name.plus(1) } var id = _id var name = _name //初始化块 init { if (id == 1) id = 2 //如果不满足条件,抛出异常 require(id > 0) { "id必须大于0" } }}fun main(args: Array<String>) { var text = TextByClass() println(text.a) //主构造函数创建 var text1 = Payer(1,"2", "w") //次构造函数创建 var text2 = Payer("asd") //默认值方式 var text3 = Payer(_name = "asd", text = "asd")}类的类型知识//类默认都是封闭的,开放继承,必须用open修饰open class ExentText( id :Int? = null){ val id: Int = 1 //可重写方法也用open修饰 open fun load() = "asd"}class ChText : ExentText(1) { override fun load() = "asd" fun abc() = "asd"}//单例对象,使用object声明object ApplicationConfig { fun doSomething() = "asd"}//伴生对象companion,不管实例多少次,只有一个伴生对象(单例)open class ConfigMap { companion object{ private const val PATH ="d:\\1.txt" fun load() = java.io.File(PATH).readText() }}//嵌套类,如果一个类针对一个类有用,可以嵌入到该类中class Text2() { class Text3() { fun show() = "asd" }}//数据类data修饰data class DataText( var a : String, var b : String) { var ab = a+b //运算符重载 operator fun plus(other:DataText) = DataText(a + other.a, b+other.b)}//解构函数class Text5(val a:Int, val b: Int) { operator fun component1() = a operator fun component2() = b}//枚举类,可定义方法enum class EnumText(private val coordinate : ExentText){ WEST(ExentText(1)), EAST(ExentText(2)); fun updateData(playData : ExentText) = ExentText(playData.id.plus( coordinate.id))}fun main(args: Array<String>) { val a = ChText() //is关键字,检查是否是该类型 println(a is ChText) println(a is ExentText) //as进行类型转换 if (a is ChText) { println((a as ChText).abc()) } //Any是所有类的超类 println(a is Any) println(ApplicationConfig.doSomething()) //只用一次的类,可以用object声明;p val p = object : ExentText() { override fun load(): kotlin.String { return "asd" } } println(p.load()) ConfigMap.load() Text2.Text3().show() val dataText = DataText("a", "b") //copy函数。复制一个对象 val copy = dataText.copy(a = "c", b = "b") var (x, y) = Text5(1,2) println("$x, $y") //数据类型直接支持 var (x1, y1) = DataText("1","2") println(EnumText.EAST) println(EnumText.EAST.updateData(ExentText(1)))}类补充enum class Dir{ APPLE, CAR, BUTTON;}class DefaultClass(var dir : Dir){ fun getDir() : String { return when(dir) { Dir.APPLE -> "aaa" Dir.CAR -> "ccc" else -> "ddd" } }}//密封类sealed class License { object apple : License() object car : License() class button(var id : Int) : License()}//比enum多返回数据class DefaultClass2(var dir : License){ fun getDir() : String { return when(dir) { is License.apple -> "aaa" is License.button -> "ccc ${(this.dir as License.button).id}" else -> "ddd" } }}fun main(args: Array<String>) { println(DefaultClass(Dir.CAR).getDir())}
-
Android kotlin学习笔记(一)
前言 kotlin很久以前就听说过了,但一直没有入手,新公司在用这项技术,所以就尽快入门。但由于每天下班回来很晚,所以就以代码+注释的方式记录。变量和函数注:函数可以作为函数的参数和返回值,kotlin对空指针进行严格的控制fun main(args: Array<String>){ var intA : Int = 1 //定义变量,常用类型Int,String,Char,Boolean,Double,List,Set,Map //val 只读变量, var普通变量 //if/else //range表达式,in A..B,in关键字用来检查某个值是否在指定范围内 if(intA in 0..3) { println("hello kotlin") } else if (intA !in 0..3){ println("hello lin") } else { println("hello main") } //when表达式 val str : String = when(intA) { 1 -> "哈哈" 2 -> "嘿嘿" else ->{ "111" } } println(str) //模板 val str1 = "hello" val str2 = "kotlin" println("$str1 in $str2") //可做逻辑运算 val isTrue = false println("is true ${if(isTrue) "abc" else "cba"}") println(funTest(1, 3)) println(funTest1(1)) //具名函数,不需要管顺序 println(funTest1( b=11, a = 22))// todoTest() `hello kotlin`() //匿名函数,匿名函数会隐式或自动返回最后一行语句的结果(隐式返回) val count1 = "hello".count() val count2 = "hello".count { a -> a == 'l' } println(count1) println(count2) //声明一个变量是匿名函数 val aFunction : () -> String = { "hello word" } //声明一个变量是匿名函数,带参数的 val aFunction1 : (String) -> String = {abc -> println(abc) "hello word $abc" } println(aFunction1("java")) //声明一个变量是匿名函数,带参数的,默认it,多参数不可用 val aFunction2 : (String) -> String = { println(it) "hello word $it" } println(aFunction2("java")) //声明一个变量是匿名函数,简化 val aFunction3 = { "hello word" } println(aFunction3()) //声明一个变量是匿名函数,类型推断 val aFunction4 = { abc : String, cba : Int -> println(abc) "hello word $abc $cba" } println(aFunction4("java", 1)) //方法参数 val aa = {g : String, l : Int -> "${g}今天是个好日期 $l " } abcd("2021年5月17日", aa) //方案参数简化 abcd("2021年5月17日") { g: String, l: Int -> "${g}今天是个好日期 $l " } //函数引用 abcd("2021年5月17日", ::aa) //获取函数 val getFunction = returnFunction("获取函数") println(getFunction("获得函数111"))}//函数,public fun funTest(a : Int, b: Int ) : Int = a + b//可直接设置缺省值public fun funTest1(a : Int, b: Int = 3) : Int = a + b//没有返回值叫unit函数//抛出异常,nothing函数fun todoTest() { TODO("异常")}//反问号的函数名,可空格和特殊字符对函数命名,// java跟kotlin相互操作,反引号括住函数名可避免冲突fun `hello kotlin` () { println("hello kotlin")}//具名函数,参数:字符串和具名函数fun abcd(a : String, b: (String, Int) -> String) { val c = (1..10).shuffled().last() println(b(a, c))}fun aa (g : String, l : Int) : String { return "${g}今天是个好日期 $l "}//返回函数fun returnFunction(a: String) : (String) ->String { return { name : String -> "返回值是一个函数,${a},${name}" }}字符串常用操作//常量const val NAME = "HELLO 'WORD"fun main(args: Array<String>) { //截取 val index = NAME.indexOf("\'") val str = NAME.substring(0, index) val str1 = NAME.substring(0 until index) //分割 val data = NAME.split(",") //目标赋值 val (abc, asd) = NAME.split(",") val str2 = "sdfghjkl" str2.replace(Regex("[abc]")) { when(it.value) { "a" -> "A" "b" -> "B" "v" -> "C" else -> it.value } } //比较内容是否相等 str1 == str2 //比较是否指向一个对象 str1 === str2 //字符串遍历 str1.forEach { println("$it *") }}数字常用操作import kotlin.math.roundToInt//Byte,Int,Short,Long,Float,Doublefun main(args: Array<String>) { //要么转Int要么空 val number : Int? = "1.121".toIntOrNull() val number1 = 1.123.toInt() //四舍五入的方式 val number2 = 1.598.roundToInt() //格式转换 println("%.2f".format(0.1111)) }安全操作符fun main(args: Array<String>) { //设置可空 var a : String ? = "asd" a = null //安全调用操作符 a?.capitalize() //操作可空 a = a?.let { if (it.isNotBlank()) { it.capitalize() } else { "" } } //为空抛异常 a!!.capitalize() //如果a等于空,则设置"acd",否则为本身 a= a ?: "acd"}异常相关import java.lang.Exceptionimport java.lang.IllegalArgumentExceptionfun main(args: Array<String>) { var a : Int ? = null try { check(a) a !!.plus(1) } catch (exception : Exception) { }}fun check(abc : Int?) { //先觉函数 checkNotNull(abc, {"操作不当"}) //调用自定义异常 abc ?: throw AbdException()}//自定义异常class AbdException : IllegalArgumentException("操作不当")标准函数import java.io.Filefun main() { var file = File("E:\\1.txt") file.setReadable(false) file.setWritable(false) //apply配置函数,返回接收者 val file1 = File("E:\\1.txt") file1.apply { setReadable(false) setWritable(false) } //let函数 val result = listOf(3,21,1).first().let { it * it } println(result) println(getFormat(null)) //run函数 val file3 = File("E:\\1.txt") file3.run { readText().contains("abc") } val isToLong = "asdasdasdasd".run ( ::isLong ) "asdasd".run(::getFormat) .run(::isLong) .run(::println) //with函数 val res1 = "asdasd".run { length > 0 } val res = with("asdaasd"){length > 0} //also函数 var file4 : List<String> File("d:\\1.txt").also { print(it.name) }.also { file4 = it.readLines() } println(file4) //takeIf,如果存在返回对象,不存在返回空 var file5 = File("1.etx") .takeIf { it.exists() && it.canRead() }?.readLines() //takeUnless,除非,跟takeif相反 var file6 = File("1.etx") .takeUnless{ it.exists() && it.canRead() }?.readLines()}fun getFormat(name : String?) : String { return name?.let { "hello $name" } ?: "no name"}fun isLong(name: String) = name.length > 10