Kotlin学习(五)之----可变集合和不可变集合,以及解构写法

一. list
1.1.可变集合与不可变集合

    //TODO:不可变集合 -- 没有add,remove等方法
    var list3 = listOf("iam")
    println(list3.get(0))
    println(list3[0])
    println(list3.getOrNull(1)?:"越界了")
    println(list3.getOrElse(1,{
    
    "越界了"}))

    //TODO:可变集合  -- 有add,remove等方法
    var list1 = mutableListOf("is your")
    list1.remove("is your")
    println(list1.getOrNull(0))

    //TODO:不可变集合to可变集合
    var list2 = list3.toMutableList()
    println(list2[0])

    //TODO:可变集合to不可变集合
    var list4 = list1.toList()
    list1.removeIf {
    
     true } //TODO:删掉符合条件的元素(此处相当于全部删了)
    println(list1)

运行结果:
在这里插入图片描述
1.2三种遍历手段

    /**
     * 遍历三种写法
     * @author Allen
     */
    val list = listOf(1,2,3)

    for( i in list){
    
    
        print("$i ")
    }
    println()

    list.forEach {
    
    
        print("$it ")
    }
    println()

    list.forEachIndexed{
    
    index: Int, i: Int ->
        print("下标为$index 元素是$i  " )
    }
    println()

在这里插入图片描述
二. 解构写法

    /**
     * 解构写法
     */
    var(num1,num2,num3) = list;
    println("num1 = $num1; num2 = $num2;  num3 = $num3")
    num1 = 4; //可变
    println("num1 = $num1; num2 = $num2;  num3 = $num3")

    val(n1,n2,n3) = list
    //只读, n1 = 4会报错

    var(_,a2,a3) = list //_表示不接收,可以优化性能
    println("num2 = $a2; num3 = $n3")

通过反编译可以看出,_表示不接受数据,反编译没有给予变量

三.Set
与list有可变和不可变

    /**
     * set集合 没有set[0]的写法, 存放无序不重复的元素
     */
    var set = setOf(1,2,3) //TODO:不可变
    val set1 = mutableSetOf(1,2,3) //TODO:可变
    set1.add(4)
    println(set.elementAt(0))
    println(set1.elementAtOrNull(1))
    println(set1.elementAtOrElse(1,{
    
    "越接了"}))
    set1 += 5;
    set1 += 4
    println(set1.elementAt(4))

四. list 与 set 互转达到去重效果
在这里插入图片描述
在这里插入图片描述
五. 数组类型
1.1
在这里插入图片描述
注意:arrayof<>()存放的是Array<对象类型>,是类对象类型
在这里插入图片描述
在这里插入图片描述
1.2 集合转数组
在这里插入图片描述
1.3 arrayof<>()
在这里插入图片描述在这里插入图片描述
六. Map
1.1获取并初始化map对象的俩种方式

    val map1 = mapOf<String,String>("小郑" to("二十"),"Allen" to("二十一"))
    val map2 : Map<String,Int> = mapOf(Pair("小郑",20), Pair("Allen",21))

1.2获取值的五种方式

    //获取值方式第一种([]符重载,其实跟get()一样)
    //无数据返回null,不会奔溃
    println(map1["小郑"])
    println(map1["佚名"])

    //获取值方式第二种
    //无数据返回null,不会奔溃
    println(map1.get("小郑"))
    println(map1.get("佚名"))

    //获取值方式第三种,defaulValue参数不是lambda
    //无数据返回defaultValue
    println(map1.getOrDefault("小郑","没有相关数据"))
    println(map1.getOrDefault("佚名","没有相关数据"))

    //获取值方式第四种,defaultValue参数是lambda(lambda作为最后一个参数可以放在括号外)
    //无数据返回defaultValue
    println(map1.getOrElse("小郑"){
    
    "没有相关数据"})
    println(map1.getOrElse("Allen",{
    
    "没有相关数据"}))
    println(map1.getOrElse("佚名"){
    
    "没有相关数据"})

    //获取值方式第五种,无数据会奔溃
    println(map1.getValue("小郑"))
    println(map1.getValue("佚名"))

在这里插入图片描述
1.3 map从可变到不可变:

    var map3 = map1.toMutableMap()
    map3.put("晓坚","二十一")
    map3.remove("Allen")
    map3.replace("小郑","二十","二十三")
    println(map3)

在这里插入图片描述
在这里插入图片描述
1.4map的四种遍历

    //第一种
    map3.forEach {
    
    
        print("${
      
      it.key}=${
      
      it.value}  ")
    }
    println()

    //第二种
    map3.forEach{
    
     Key,Value ->
        print("$Key=$Value  ")
    } //key和value应该是配对的,所以这里会花波浪线表示这么做没有错,但是不太好
    println()

    //第三种
    map3.forEach {
    
     (K,V) ->
        print("$K=$V  ")
    }
    println()

    //第四种
    for(item in map3){
    
    
        print("$item  ")
    }

在这里插入图片描述
其中第四种相当于

    //第四种
    for(item : Map.Entry<String,String> in map3){
    
    
        print("$item  ")
    }

但由于默认会推导并增加:Map.Entry<String,String>,所以可以不写

扫描二维码关注公众号,回复: 13667693 查看本文章

猜你喜欢

转载自blog.csdn.net/XJ200012/article/details/122521682