kotlin基础学习-4(集合,类相关)

  • list创建与元素获取
//list创建和元素获取
    //创建list,但是是不可变的
    val list = listOf("Jason", "jack", "jonse")
//    println(list[3])//报异常

//getorElse是一个安全索引取值函数,它需要两个参数,第一个是索引值,第二个是能提供默认值的lambda表达式,如果索引值不存在,可用来代替异常
    println(list.getOrElse(3) {
        "unknown"})
    //另一个安全索引取值函数,它返回null结果,而不是抛出异常,因此适用于空安全运算符
    println(list.getOrNull(3)?:"unknown")
  • mutator函数
    能修改可变列表的函数有一个统一的名字:mutator函数
    添加元素运算符 += 与删除元素运算符 -=
//可变列表
    val mutableListOf = mutableListOf("Jason", "jack", "jonse")
//    mutableListOf.add("jinzong")
//    mutableListOf.remove("jonse")
//    println(mutableListOf)

    //List支持使用toList和toMutableList函数动态实现只读列表和可变列表的相互转换
    val toMutableList = list.toMutableList()
    val toList = mutableListOf.toList()

    //mutator函数
    //能修改可变列表的函数有个统一的名字,mutator函数,例如上面的add,remove
    //添加元素运算符+=
    //删除元素运算符-= 
    //基于lambda表达式指定的条件删除元素
    mutableListOf += "jinzong"
    mutableListOf -= "jonse"
    println(mutableListOf)
  • list集合遍历
//集合遍历
    for (s in list) {  //这个直接敲list.就可以找到for
        println(s)
    }

    //与上面一样的意思
    list.forEach {
        println(it)
    }

    //带坐标
    list.forEachIndexed { index, s ->
        println("$index $s")
    }
  • 解构语法过滤元素
    通过_符号过滤不想要的元素
 //解构语法过滤元素
    //通过_符号过滤不想要的元素,这是之前的解构函数,如果我们不想给第二个元素赋值,直接使用_就行
    val (a,b,c)= list
    //过滤,相当于不给第二个元素赋值
    val (a2,_,c2)= list
  • set创建与元素的获取
//set创建和元素的获取与list,区别和java的是一样的,list是有序且可以重复,set无序并且元素不能重复
    val set = setOf("jack", "jacky", "jonse")
    val elementAt = set.elementAt(2)//读取集合中的元素
//    set.elementAtOrNull(2)   与list一样
//    set.elementAtOrElse(2){"unknown"}   //与list一样
    println(elementAt)

    //语法和list是一样的
    val mutableSetOf = mutableSetOf("jack", "jacky", "jonse")
    mutableListOf.add("tom")
    mutableListOf.remove("jonse")
    mutableListOf += "jarry"
    mutableListOf -= "jack"

  • 集合转换与快捷函数
//集合转换与快捷函数
    //需求把list中的元素去重
    val list2 = listOf("jack", "jacky", "jack")
        .toSet() // 去重
        .toList() //再转换成list
    println(list2)
    //kotlin提供了一种快捷的去重函数
    val list3 = listOf("jack", "jacky", "jack").distinct()
    println(list3)
  • 数组类型
//数组类型
    //kotlin提供各种Array,虽然是引用类型,但可以编译成java基本数据类型
    /**
     *            数组类型                           创建函数
     *            IntArray                          intArrayOf
     *            DoubleArray                       dooubleArrayOf
     *            LongArray                         longArrayOf
     *            ShortArray                        shortArrayOf
     *            ByteArray                         byteArrayOf
     *            FloatArray                        floatArrayOf
     *            BooleanArray                      booleanArrayOf
     *            Array                             arrayOf
     */

    val intArray = intArrayOf(1, 2, 3)
    val toIntArray = listOf(1, 2, 3).toIntArray()
    val arrayOf = arrayOf(File("xxxx"), File("xxxxxxxx"))
  • map的创建,读取以及遍历
//map的创建
    //to看上去像关键字,但事实上,它是个省略了点和参数的特殊函数,to函数将它左边和右边的值转换成一堆Pair
    val map = mapOf("guo" to 20, "jin" to 21, "zhang" to 23)
//    mapOf(Pair("guo",20),Pair("jin",21),Pair("zhang",23))  和上面这句代码一个意思
    println(map)

    //读取map的值
    /***
     *      []取值运算符,读取键对应的值,如果键不存在返回null
     *      getValue,读取键对应的值,如果不存在就抛出异常
     *      getOrElse,读取键对应的值,使用匿名该函数返回默认值
     *      getOrDefault,读取键对应的值,或者返回默认值
     */

    println(map["guo"])
    println(map.getValue("guo"))
    println(map.getOrElse("aaa"){0})
    println(map.getOrDefault("bb",1))

    //map的遍历
    map.forEach { (key, value) ->
        println("$key  $value")
    }

    map.forEach {
        println(it.key + "   " + it.value)
    }

    //map的可变集合
    val mutableMap = mutableMapOf("guo" to 1, "jin" to 2, "zhang" to 3)
    mutableMap += "li" to 4
    mutableMap.put("wang",5)

    //获取对应键的值,如果不存在这个键,就将这一对键值对存入;如果存在,直接取出map中对应的值
    println(mutableMap.getOrPut("zheng",{7}))
    println(mutableMap)
  • 定义类与filed关键字
//定义一个类
class Player{
    //kotlin只需要声明属性,会自动生成get和set方法。针对定义的每一个属性,kotlin都会产生一个field。
    //field存储属性数据,不能自己定义field,kotlin封装field,只暴露get和set方法
    var name = "jack"
        //我们也可以重新定义get和set方法
        get() = field.capitalize() // 返回首字母大写的字符串
        set(value) {
            value.trim()
        }
}
  • 主构造函数和次构造函数以及初始化块
//类的主构造函数,主构造函数在类名后加小括号
class Student(
    //这里就是主构造函数,它的作用就是赋值给filed值,所以这里就是一个临时变量的存在,通常都会以下划线开头的名字命名
    _name : String,
    _age  : Int,
    _isNormal : Boolean
){
    //每一个field重写get和set方法,需要放在其对应的下面。
    var name = _name
        get() = field.capitalize()
        set(value) {
            value.trim()
        }
    var age = _age
    var isNormal = _isNormal
}

//kotlin允许不使用临时变量赋值,而是直接在主构造函数中定义类属性,这样可以减少代码
class Student2(
    _name: String,
    var age : Int,
    var isNormal : Boolean
){
    //每一个field重写get和set方法,需要放在其对应的下面。
    var name = _name
        get() = field.capitalize()
        set(value) {
            value.trim()
        }

   //次构造函数,有主就有次,我们可以定义多个次构造函数来配置不同的参数组合
    constructor(_name: String) : this (_name,age = 10,isNormal = false)


    //初始化块,与java的static不一样,这里的初始化块是构造函数执行的时候,就会执行初始化快
    init {
        //先决函数,如果boolean值是false,执行lambda抛出异常
        require(age > 0) {
            "age must be positive"
        }
        require(name.isNotBlank()){
            "student must have a name"
        }
    }
}
  • 类中的构造函数以及代码块等初始化顺序
/**
 * 初始化顺序
 * 1.先初始化主构造函数里声明的属性
 * 2.类级别的属性赋值,                                 这里第二步和第三步的顺序调用取决于谁在上谁在下,这是个坑,分上下顺序的
 * 3.init初始化块里的属性赋值和函数调用
 * 4.次构造函数里的属性赋值和函数调用
 * 可以在showkotlinbytecode查看调用顺序
 */
class Student3(
    _name: String,
    //第一步执行
    var age : Int
){
    //第二步执行
    var name = _name
    var score = 10//如果这一行写到init下面,那么init里的score*4就报错了。。。

    init {
        println(score*4)
        //第三步执行
        println("init函数执行")
    }

    constructor(name2:String) :this(name2,30){
        score =100  //第四步执行
    }

}
  • 延迟初始化lateinit
/**
 * 延迟初始化
 * 使用lateinit关键字相当于做了一个约定:在用它之前做初始化
 *
 */
class Player2{
    lateinit var equipment : String

    fun ready(){
        equipment = "ak47"
    }

    fun battle(){
        if (::equipment.isInitialized) println(equipment)
    }
}
  • 惰性初始化by lazy
class Player3{
    //使用它时再去初始化
    val config by lazy { loadConfig() }

    private fun loadConfig():String{
        println("loading ....")
        return "xxx"
    }
}

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

推荐阅读更多精彩内容