kotlin 集合 区间 与 数组

1,019 阅读4分钟

kotlin中的集合

  val list1= listOf(1,2,3)//不能添加或者删除元素
    val list2= mutableListOf(1,2,3)//可以添加或者删除元素

    val list3=ArrayList<String>()


    // a to b 就是 k -v 键值对的 简单写法
    val map= mapOf("name" to "wuyue","age" to 20) //无法put 元素 不可变的
    //any 就是java中的object 所有类的父类
    val map3:Map<String,Any> = mapOf("name" to "wuyue","age" to 20)
    

    val map2= mutableMapOf("name" to "wuyue","age" to 20)//可以put remove元素

主要就是可变和不可变,代码注释写的很详细了。不多说。

额外要注意的是Kotlin中的ArrayList 其实就是

SinceKotlin("1.1") public actual typealias RandomAccess = java.util.RandomAccess


@SinceKotlin("1.1") public actual typealias ArrayList<E> = java.util.ArrayList<E>
@SinceKotlin("1.1") public actual typealias LinkedHashMap<K, V> = java.util.LinkedHashMap<K, V>
@SinceKotlin("1.1") public actual typealias HashMap<K, V> = java.util.HashMap<K, V>
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
@SinceKotlin("1.1") public actual typealias HashSet<E> = java.util.HashSet<E>


这里typealias 就是别名的意思,这个东西的作用主要就是用来处理多平台的,比如js中没有这些东西, kotlin又支持编译成js代码,所以就有一个别名的概念, 虽然你js没有 但是我可以实现啊,只是实现了以后对外暴露的 还得叫ArrayList。

val list3 = ArrayList<String>()

    for (i in 0..100) {
        list3 += "num:$i"//这里就是类似于java中的add函数,只不过kotlin支持了运算符重载所以有这种简便的写法
    }
 list3 -= "num:0"//删除一个元素
 list3[0]="wuyue"//给一个元素赋值

map的类型在kotlin中也可以用[] 来处理赋值和取值。 基本上就是这些。 总结一下 集合 java和kotlin的区别

  • kotlin中的集合类型 分为可变和不可变,一定程度上能提高我们代码的安全性
  • kotlin中的集合类型 有很多操作符重载的概念,比如[] 等等,可以有效提高我们编码的速度和可读性

Pair与Triple类型

kotlin还方便的提供了键值对类型。

 val pair="hello" to "kotlin" 
    var pair2=Pair("hello","wuyue")
    println(pair.first+"   "+pair.second)//hello   kotlin

    val(x,y)=pair2// 结构的表达式

    println(x)//hello
    println(y)//wuyue

还有三元类型

val t1 = Triple("hello", "wolrd", "wuyue")

挺好理解的 就不多说了

区间

 //char long 也可以用区间
    val intRange = 1..10//[1,10] 闭区间
    val charRange = 'a'..'z'

    val intRangeExclusive = 1 until 10 //[1,10) 前闭后开 区间

    val intRangeReverse = 10 downTo 1 //[10,9,8...1]  闭区间

    val intRangeWithStep = 1..10 step 2 // 设定区间的步长 1 3 5 7 9
    println(intRangeWithStep.joinToString())

区间 更多的应用是在循环中

 // 区间的遍历 和数组是一样的
    val array = intArrayOf(1, 3, 5, 7)
    //这个就相等于 java代码里 我们遍历时常用的 for(int i=0;i<array.size;i++)
    for (i in 0 until array.size) {
        println(array[i])
    }
    //下面这两种 就是上面的的简写 写法
    for (i in array.indices) {
        println(array[i])
    }

    for (element in array) {
        println(element)
    }

数组

再看看基本使用

 //下面这两种数组的创建方式 是等价的
    val c0 = intArrayOf(1, 2, 3, 4, 5)
    //这个5 就代表数组的大小  it 就代表数组的下标
    val c1 = IntArray(5) { it + 1 }
    //这种打印的 就不是数组的内容了 是数组的地址
    println(c0)
    //可以用这个函数 来方便的将数组打印出来
    println(c1.contentToString())
    //java中数组的长度是length 其他都是size 而在kotlin中 统一都处理成size 来获取大小
    println(c1.size)


    val d = arrayOf("hello", "world")
    println(d.contentToString())

    val e = floatArrayOf(1f, 2f, 4f, 7f)
    //与java中的 for(el:e)  等价
    for (el in e) {//数组的遍历
        println(el)
    }
    //与 java中的 for(int i=0;<xx.length;i++)
    e.forEach {
        println(it)
    }
    //判断是否在数组中
    if (1f in e) {
        println("1f in e")
    }
    //判断是否在数组中
    if (3f !in e) {
        println("3f not in e")
    }

函数和方法

大部分情况下 方法和函数的含义是一样的。 非要区分的话 是如下的区别;

  • 方法是有receiver的,比如java中的每个函数 都必须在一个类里面来定义, 这就意味着 一定是 x.method 这个x 就是receiver 是method所在类的一个对象。

  • 而函数可以不依托类而存在,kotlin中的顶层函数就是如此。 他是没有receiver的。

  • 其实两者也没多大区别 函数其实也是一种方法,只不过他是特殊的方法 这个方法的第一个参数就是receiver,有兴趣的同学可以看一下python的方法定义,第一个参数往往就是self 这个self 其实就是receiver。

谨记 kotlin中的函数引用写法:

函数引用其实就有点类似于 c语言中的函数指针。

//与java中的可变参数 是一个意思  java中是 String... args 的写法
fun t3(vararg args:String){
    
}

你看 经常使用的listof 就是用的这种写法

函数中添加默认参数的写法: