数组
-
Kotlin为数组增加一个Array类,基本类型数组增加了XxxArray(Byte Short Int等基本类型)。Kotlin的数组使用
Array<T>
类表示。Kotlin创建数组其实就是创建Array<T>
类的实例 -
创建数组的两种形式
- 使用arrayOf()、arrayOfNulls()、**emptyArray()**工具函数
- 使用**Array(size:Int, init:(Int)->T)**构造器
-
由于
Array<T>
类要求元素必须是引用类型。因此如果将基本类型的值存入Array<T>
种,Kotlin会将这些基本类型的值自动装箱成包装类的实例。如果需要基本类型,Kotlin提供了ByteArray、ShortArray、IntArray、LongArray、CharArray、FloatArray、DoubleArray、BooleanArray,分别对应java的byte[]、short[]、int[]、long[]、char[]、float[]、double[]、boolean[]这8种基本类型的数组。 -
对于XxxArray数组,不支持元素初始化为null的方式创建数组,因为基本类型的元素不允许为null
-
案例
var arrStr = arrayOf("jannal", "jack", "tom") //相当于java静态数组的初始化 var arrInt = arrayOf(1, 2, 3, 4) //创建指定长度、元素为null的数组,相当于java数组的动态初始化 var arrNull = arrayOfNulls<Int>(6) //长度为0的空数据 var emptyArray = emptyArray<String>() //使用lambda表达式初始化数组元素的 var lambdaArray = Array(5) { "jannal" } //创建基本类型的数组 var intArray = intArrayOf(1, 2, 3, 4) var charArray = CharArray(5, { (it * 2 + 97).toChar() }) //[a, c, e, g, i] println(Arrays.toString(charArray)) println(Arrays.toString(intArray)) //获取元素值[]本质就是get(index)和set(index,value) //2 println(intArray[1]) //2 println(intArray.get(1)) intArray[1] = 6 // 6 println(intArray[1])
-
数组遍历
fun arrayIterator() { var intArray = intArrayOf(1, 2, 3, 4) // 1 2 3 4 for (i in 0 until intArray.size) { print(" " + intArray[i]) } println() //1 2 3 4 使用lastIndex返回最后一个元素的索引值 for (i in 0 until intArray.lastIndex) { print(" " + intArray[i]) } println() //1 2 3 indices 返回数组的索引区间 for (i in intArray.indices) { print(" " + intArray[i]) } println() //1 2 3 4 for (i in intArray) { print(" " + i) } println() //0:1 1:2 2:3 3:4 同时访问索引和元素 for ((index, value) in intArray.withIndex()) { print("${index}:${value} ") } }
集合
-
Kotlin自己提供了一套集合体系,Kotlin的集合体系抛弃了java集合系统中的Queue集合。增加了可变集合和不可变集合
-
Kotlin在JVM平台并为真正实现HashSet、LinkedHashSet、ArrayList这些类。只是为java的HashSet、LinkedHashSet、ArrayList指定了一个类型别名而已,这样就可以直接借用java的集合类。Kotlin为这些集合类扩展了更多的方法
-
创建Set
- setOf:返回不可变集合
- mutableSetOf:返回可变的MutableSet集合
- hashSetOf:返回可变的HashSet集合
- linkedSetOf:返回可变的LinkedHashSet集合。
- sortedSetOf:返回可变的TreeSet集合
var set = setOf<String>("jannal", "jack") val mutableSet = mutableSetOf<String>("jannal", "jack", "tom") val hashSet = hashSetOf<String>("jannal", "jack", "tom") //实际类型:class java.util.LinkedHashSet println("实际类型:${set.javaClass}") //实际类型:class java.util.LinkedHashSet println("实际类型:${mutableSet.javaClass}") //实际类型:class java.util.HashSet println("实际类型:${hashSet.javaClass}")
-
Set相关方法
var set = setOf<String>("jannal", "jack", "tom") //判断是否所有元素都大于4 false println(set.all { it.length > 4 }) //只要其中一个长度大于4 true println(set.any({ it.length > 4 })) //true println("jannal" in set) //false println("jannal" !in set) //查找某个元素出现的位置 println(set.indexOf("jack")) var set2 = setOf<String>("jannal", "kotlin", "c++") //并集,因为有operator修饰的plus和minux,所以可以使用+ -运算 //[jannal, jack, tom, kotlin, c++] println(set + set2) //[jack, tom],差集 println(set - set2)
-
List和Map与Set类似。
Stream
-
Streams最初是从Java8引入的。Kotlin中的Streams API与Java API几乎相同,但是其中包含一些附加功能和扩展功能。Kotlin的Stream可以在JDK6中使用
-
Stream与Collection的区别
- Collection是一种数据结构用于存储一组数据,Stream不是一种数据结构,也不存储任何内容,Stream可以按需获取数据。
- Collection必须有一个有限的大小限制,Stream不需要有任何特定的大小限制
- 在访问Collection元素时可以随时进行操作,在使用Streams时,在Stream的生命周期内只能访问一次Stream的元素
- Collection非惰性求值。Stream采用惰性求值,按需的方式创建对象
-
案例
fun main() { val stream = 1.rangeTo(10).asSequence().asStream() val list = stream .filter { it % 2 == 0 } .peek { print("$it ") } .skip(2) .peek { println("") } .collect(Collectors.toList()) println(list) }