集合 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())}