数组,集合

数组

val arrayOf = arrayOf(1, 2, 3)//[1,2,3]
val arrayOfNulls = arrayOfNulls<String>(5)//创建一个大小5,元素都为空的数组
val array = Array(5, { i -> i * 2 })
//最后一个参数是Lambda表达式时可以移出去
val array1 = Array(5) { i -> i * 2 }
原生类型数组

Kotlin 也有无装箱开销的专门的类来表示原生类型数组: ByteArray、 ShortArray、IntArray 等等

// 大小为 5、值为 [0, 0, 0, 0, 0] 的整型数组
val arr = IntArray(5)

// 例如:用常量初始化数组中的值
// 大小为 5、值为 [42, 42, 42, 42, 42] 的整型数组
val arr = IntArray(5) { 42 }

// 例如:使用 lambda 表达式初始化数组中的值
// 大小为 5、值为 [0, 1, 2, 3, 4] 的整型数组(值初始化为其索引值)
var arr = IntArray(5) { it * 1 }

集合

Kotlin 标准库提供了基本集合类型的实现: set、list 以及 map

  • List 是一个有序集合,可通过索引(反映元素位置的整数)访问元素。元素可以在 list 中出现多次。列表的一个示例是一句话:有一组字、这些字的顺序很重要并且字可以重复。
  • Set 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。一般来说 set 中元素的顺序并不重要。例如,字母表是字母的集合(set)。
  • Map 是一组键值对。键是唯一的,每个键都刚好映射到一个值。值可以重复。map 对于存储对象之间的逻辑连接非常有用,例如,员工的 ID 与员工的位置。
接口图

List

由于List是一个接口,所以只能用kotlin提供的标准库函数创建list

//1.不可变 list
val a = listOf(1, 2, 3, "4")
val b = listOf<Int>(1, 2, 3, 4)

val array = arrayOf(1, 2, 3)
val c = listOf(array)

//2.不为空 list
val d = listOfNotNull(1, null, 3)//会自动去掉传入的null
println(d.size)
d.forEach(::print)

//3.可变 list
val aa = mutableListOf(1, 2, 3)
aa.add(4)
aa.forEach { println(it) }

//4
val d = arrayListOf(1, 2, 3)

Set

//1.不可变set
val a = setOf(1, 2, 3, 1, 2, 4)
a.forEach(::print)
println()

//2.可变set
val b = mutableSetOf("a", "b", "c")
b.forEach(::print)
println()
b.add("d")
b.forEach(::print)
println()
b.first()//可变set实现默认为 LinkHashSet

//3.HashSet
val c = hashSetOf(1, 2, 3)

//4.LinkedHashSet
val linkedSetOf = linkedSetOf(1, 2, 3)

//5.TreeSet
val e = sortedSetOf(5, 1, 8, 3)
e.forEach(::print)

Map

//1.不可变map
val a = mapOf(1 to "a", 2 to "b", 3 to "c")
//2.可变map
val b = mutableMapOf("a" to 1, "b" to 2)
b.put("c", 3)
b["c"] = 3
//3.HashMap
val c = hashSetOf(1 to "a", 2 to "b", 3 to "c")
//4.LinkedHashMap
val d = linkedMapOf(1 to "a", 2 to "b", 3 to "c")
//5.TreeMap
val e = sortedMapOf(2 to "b", 1 to "a", 3 to "c")
e.forEach(::println)

集合转换

映射
val a = listOf(1, 2, 3)
val b = a.map { it * 3 }
b.forEach(::print)
println()

//转换的过程中产生了null,mapNotNull可以过滤掉
val c = listOf(1, 2, 3)
val mapNotNull = c.mapNotNull {
    if (2 == it) null else it
}
mapNotNull.forEach(::print)
println()

val d = mapOf(1 to "a", 2 to "b", 3 to "c")
val mapKeys = d.mapKeys { it.key + 1 }//value不变,key变成对应值
mapKeys.forEach(::print)
println()

val mapValues = d.mapValues { it.value.toUpperCase() }//key不变,value变成对应值
mapValues.forEach(::print)
println()
合并
val colors = listOf("red", "brown", "grey")
val animals = listOf("fox", "bear", "wolf")
println(colors.zip(animals))
val twoAnimals = listOf("fox", "bear")
println(colors zip twoAnimals)
val a = listOf(1 to "a", 2 to "b", 3 to "c")
val unzip = a.unzip()
println(unzip)
关联
//以原集合作为 键,创建一个相关联的Map
val a = listOf("one", "two", "three", "four")
val associateWith = a.associateWith { it.length }
println(associateWith)
//以原集合作为 值,创建一个相关联的Map
val b = listOf("one", "two", "three", "four")
val associateBy = b.associateBy { b.indexOf(it) }
println(associateBy)
//Map 键和值都是通过集合元素生成的
val aa = listOf("1 a", "2 b", "3 c")
val associate = aa.associate {
    val split = it.split(" ")
    split[0] to split[1]
}
println(associate)
字符串表示
val numbers = listOf("1", "2", "3", "4", "5", "6", "7", "8")
println(numbers)
println(numbers.joinToString())
println(
    numbers.joinToString(
        separator = " ; ",
        prefix = "{",
        postfix = "}",
        limit = 5,
        truncated = "..."
    )
)
println(numbers.joinToString(
    separator = " ; ",
    prefix = "{",
    postfix = "}"
) {
    "${it}_${it}"
})
//joinTo返回 Appendable对象
val listString = StringBuffer("The list of numbers: ")
val joinTo = numbers.joinTo(listString)
joinTo.append("...")
println(listString)

过滤

过滤

对于 List 和 Set,过滤结果都是一个 List,对 Map 来说结果还是一个 Map

val aa = listOf(1, 2, 3, 4, 5, 6)
val filter = aa.filter { it > 3 }
println(filter)
val bb = mapOf("100" to 1, "101" to 2, "200" to 3, "201" to 4)
val filteredMap = bb.filter {
    it.key.startsWith("1") && it.value < 3
}
println(filteredMap)
//考虑元素在集合中位置中的过滤
val numbers = listOf("one", "two", "three", "four")
val filterIndexed = numbers.filterIndexed { index, s ->
    index > 1 && s.length > 4
}
println(filterIndexed)
//过滤某类的实例对象
val cc = listOf(1, "2", 3, null, "5")
val filterIsInstance = cc.filterIsInstance<String>()
println(filterIsInstance)
//过滤非空
val dd = listOf(1, 3, null)
val filterNotNull = dd.filterNotNull()
println(filterNotNull)

+/-操作符

  • +的结果包含原始集合 和 第二个操作数中的元素。
  • -的结果包含原始集合中的元素,但第二个操作数中的元素 除外。 如果第二个操作数是一个元素,那么 minus 移除其在原始集合中的 第一次 出现;如果是一个集合,那么移除其元素在原始集合中的 所有 出现
val numbers = listOf("one", "two", "three", "four")

val plusList = numbers + "five"
val minusList = numbers - listOf("three", "four")
println(plusList)
println(minusList)

分组

val numbers = listOf("one", "two", "three", "four", "five")
//返回一个Map,Map的key是 lambda 的结果, value是List, 对应的值是返回此结果key的元素
println(numbers.groupBy { it.first().toUpperCase() })
//返回一个Map,Map的key是keySelector的结果, value是List, 对应的值是返回此结果key的元素 通过valueTransform转换的结果
println(numbers.groupBy(keySelector = { it.first() }, valueTransform = { it + "66" }))
//获取一个 Grouping,用于后续的 对所有分组进行的操作,比如 fold reduce操作
val grouping = numbers.groupingBy { it.first() }
//eachCount
println(grouping.eachCount())
//fold,有初始值累积
val fold = grouping.fold("aaa") { sum, it ->
    "$sum-$it"
}
println(fold)
//reduce, 无初始值累积
val reduce = grouping.reduce { key, sum, it ->
    "$sum-$it-$key"
}
println(reduce)

取一部分

val numbers = listOf("one", "two", "three", "four", "five", "six")
//取指定索引
println(numbers.slice(1..3))
println(numbers.slice(0..4 step 2))
println(numbers.slice(setOf(3, 5, 0)))
//从头开始取3个
println(numbers.take(3))
//从尾取三个
println(numbers.takeLast(3))
//从头丢弃一个
println(numbers.drop(1))
//从尾丢弃5个
println(numbers.dropLast(5))

//分块
val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
println(list.chunked(3))

取单个元素

val numbers = linkedSetOf("one", "two", "three", "four", "five")
println(numbers.elementAt(0))
//第一个
numbers.first()
//最后一个
numbers.last()
//满足条件的第一个
numbers.first { it.startsWith("th") }
//避免超出索引范围导致异常
println(numbers.elementAtOrNull(5))
//索引超出范围,可以返回一个lambda表达式结果
println(numbers.elementAtOrElse(5) { "the index of $it is null" })

//随机取
val numbers = listOf(1, 2, 3, 4)
println(numbers.random())

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

推荐阅读更多精彩内容