Kotlin 小细节记录(4)

57.Kotlin语言的List创建与元素获取
58.Kotlin语言的可变List集合
59.Kotlin语言的mutator函数
60.Kotlin语言的List集合遍历
61.Kotlin语言的解构语法过滤元素

62.Kotlin语言的Set创建与元素获取
63.Kotlin语言的可变Set集合

64.Kotlin语言的集合转换与快捷函数
65.Kotlin中的数组类型

66.Kotlin语言的Map的创建
67.Kotlin语言的读取Map的值
68.Kotlin语言的遍历Map
69.Kotlin语言的可变Map集合

70.Kotlin语言的定义类与field关键字

71.Kotlin语言的 计算属性 与 防范竞态条件

72.Kotlin语言的主构造函数
73.Kotlin语言的主构造函数里定义属性
74.Kotlin语言的次构造函数
75.Kotlin语言的构造函数中默认参数
76.Kotlin语言的初始化块
77.Kotlin语言的构造初始化顺序
78.Kotlin语言的延迟初始化lateinit
79.Kotlin语言的惰性初始化by lazy

80.Kotlin语言的初始化陷阱

基础遍历,防止崩溃getOrElse/getOrNull

val list = listOf("A","B","C","D")
    println(list[3])

    // 防止崩溃方式
    println(list.getOrElse(5){"越界"})
    println(list.getOrNull(5)?:"your out of bound")

不可变集合与可变集合互相转换,toList,toMutableList

    val mlist = mutableListOf("A","B","C")
    mlist.add("D")
    mlist.remove("A")

    //不可变集合变成可变集合
    val list2 = list.toMutableList()
    list2.add("E")

    // 可变集合 变成 不可变
    val list3 = mlist.toList()

    // 运算符重载,add remove
    val list4 =  mutableListOf("A","B","C","D")
    list4 += "AA"
    list4 -= "A"
    println(list4)

动态移除removeIf,和获取下标的遍历 forEachIndexed,+=和-=可变数组的操作符重载


    // removeIf
    val list5 = listOf("A","B")
    list4.removeIf{list5.contains(it)}
    println(list4)

    // 遍历
    for (s in list) {
        println(s)
    }

    list.forEach{
        println(it)
    }   

    list.forEachIndexed{s,i->
        println("item ${s} index ${i}")
    }

    val listNull = listOf<String>()
    val ttt = listNull.getOrNull(0)
    ttt.apply {
        if(this == null) {
            println("null")
        }
    }

    ttt?.apply {
        println("aaaaa")
    }

解构

val vlist = listOf("A","B","C")
    // 解构
    var (v1,v2,v3) = vlist
    println("$v1,$v2,$v3")
    // 过滤结构赋值
    val (_,n1,n2) = vlist

    val(_,t2,t3) = Triple(1,2,3)

Set 集合不允许重复,操作和list类似,比较有用的越界保护

fun main() {
    val set:Set<String> = setOf("aaa","bbb","ccc","ccc")
    println(set)
    println(set.elementAt(0))
    println(set.elementAt(1))
    println(set.elementAt(2))
    println(set.elementAtOrElse(3) { "越界了" })
    println(set.elementAtOrNull(3)?:"out of bounds")

    val mutableSet:MutableSet<String> = mutableSetOf("AAA","BBB")
    mutableSet += "David"
    mutableSet += "zcw"
    mutableSet -= "David"
    mutableSet.add("zcwfeng")
    mutableSet.remove("zcw")
    println(mutableSet)
}


数组操作,arrayOf事对象类型,越界保护

    intArrayOf()
    doubleArrayOf()
    floatArrayOf()
    longArrayOf()
    charArrayOf()
    byteArrayOf()
    booleanArrayOf()
    shortArrayOf()
    emptyArray<Unit>()
    ubyteArrayOf()
    uintArrayOf()
    ulongArrayOf()
    ushortArrayOf()

fun main() {
    val inArray = intArrayOf(1,2,3,4,5)
    println(inArray[4])
    println(inArray.elementAtOrElse(5){-1})
    println(inArray.elementAtOrNull(5)?:"越界了")

    val charArray = listOf('A','B','C').toCharArray()

    val objArray/*:Array<File>*/ = arrayOf(File(""),File(""))

}

Map 操作,getOrPut有些场景很方便,可以放入Pair做key,value

val map = mapOf<String,Double>("David" to(12.34) ,"Lucy" to 123.44)
    val map2 = mapOf(Pair("David",12.34),Pair("Lucy",123.44),"AAA" to 22.22)
    println(map["David"])
    println(map.getOrDefault("David","test"))
    println(map.getOrElse("Lucy0") { "test" })

    map2.forEach {
        println("Key->${it.key},value->${it.value}")
    }

    map2.forEach { (key,value) ->
        println("Key->${key},value->${value}")
    }

    for (entry in map2) {
        println("Key->${entry.key},value->${entry.value}")
    }
    val map3 = mutableMapOf(Pair("David",12.34),Pair("Lucy",123.44),"AAA" to 22.22)
    map3 += "AAAA" to 7777.0
    map3 -= "AAAA"
    map3.put("CCC",0.3)
    map3.getOrPut("FFF"){444.44}//判断有没有,有返回,没有加入
    println(map3)

类默认field 的set和get。 get() 覆盖field内容,防范竞态条件

class Person{
    var name     = "zcwfeng"
        /*set(value) {
            field = value
        }
        get() = field*/
    var info:String? = ""//"ddd"//null/*"be success!"*/

    val number : Int
        get() = (1..1000).shuffled().first()

    // 防范竞态条件,Kt的编程规范
    fun getShowInfo():String{
        return info?.let {
                if(it.isBlank()){
                    "空串"
                } else {
                    "最终info是:${info}"
                }


        }?: "你是null,注意"
    }
}

fun main() {

    println(Person().number)
    println(Person().getShowInfo())

}

主构造函数,定义属性



// 主构造函数,参数不能直接使用
class User(_name: String, _sex: Char, _age: Int, _info: String) {
    var name = _name
        get() = field
        set(value) {
            field = value
        }
    var age = _age
        get() = field + 1
    val sex = _sex
        get() = field

    val info = _info
        get() =
            field.let {
                if (it.isNullOrBlank()) {
                    ""
                } else {
                    "[$field]"
                }
            }




    fun show() {
        println(name)
    }
}
//简写
class User2(var name: String, var sex: Char, var age: Int, var info: String){

    fun show() {
        println(name)
        println(sex)
        println(age)
        println(info)
    }

}

fun main() {

    val p = User(_name = "zcw", _sex = 'M', _age = 18, _info = "aaa")
    println(p.name)
    println(p.info)
    User2(name = "zcw", sex = 'M', age = 18, info = "aaa").show()
}

init 代码块初始化检测require, init 代码块和累成员变量是并列关系,先写谁先执行谁

class User3(var name:String = "1" ){
    init {
        println(name)

        require(!name.isNullOrBlank()){
            println("初始化空")
        }
    }
    constructor(name:String = "2", sex:Char) : this(name) {
        println("constructor(name:String, sex:Char)")
    }
    constructor(name:String = "3", sex:Char,age:Int) : this(name) {
        println("constructor(name:String, sex:Char,age:Int)")

    }
    constructor(name:String = "4", sex:Char,age:Int,info: String) : this(name) {
        println("(name:String, sex:Char,age:Int,info: String)")
    }

}

lateinit 使用保护注意,使用过程可能会漏掉初始化,所以注意判断保护。

    lateinit var demo3:String

fun show(){
        if(::demo3.isInitialized){
            println(demo3)
        }else {
            println("你忘记初始化")
        }
    }

by lazy 惰性加载,区别直接加载

class P{
    val demo4 = testByLazy()
    val demo5 by lazy { testByLazy() }

    private fun testByLazy():String{
        println("test")
        println("test")
        println("test")
        println("test")
        return "result is OK"
    }
}


  val p = P()
    Thread.sleep(5000)
    println("will be used")
//    println(demo4)
    println("${p.demo5}")

kotlin 顺序的潜在bug,非常小心, 注释中的第一行和最后一行互换测试

class MyContent(_info:String){
//    val content:String = getMyInfo()
    private val info = _info
    private fun getMyInfo():String = info

    val content:String = getMyInfo()

}

fun main() {

    println(MyContent("david").content.length)

}

可变参数,遍历可以不加?判断


fun recycleBitmap(vararg bitmaps: String?) {
    bitmaps.apply {
        for (bm in this) {
            bm?.apply {
                println("axiba")
            }

        }
    }
}

var demos:String? = "null"
var demos:String? = null

    recycleBitmap(demos)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,578评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,701评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,691评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,974评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,694评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,026评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,015评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,193评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,719评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,442评论 3 360
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,668评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,151评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,846评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,255评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,592评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,394评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,635评论 2 380

推荐阅读更多精彩内容