kotlin 数据集合

与大多数语言不同,Kotlin区分只读集合和可读写集合,这有助于消除bug和设计良好的API。

只读 可读写
Collection<out T> MutableCollection<T>
List<out T> MutableList<T>
Set<out T> MutableSet<T>
Map<K, out V> MutableMap<K, V>
以List集合为例:
//只读集合
val list = listOf(1, 2, 3)                  //list的类型是List<out T>,即只支持读,不支持写。泛型被out修饰,因此List<out T>是一个可协变的类型
//list.add(4)                               //编译报错,不允许写操作

//可读写集合
val mutableList = mutableListOf(1, 2, 3)    //mutableList的类型是MutableList<T>,支持读写。MutableList<T>不可协变也不可逆变
mutableList.add(4)

kotlin初始化集合的形式(注意返回的对象是kotlin、java集合对象的哪一个):

val list1 = listOf<Int>() 【intArrayOf()、booleanArrayOf()...】 //返回的是kotlin的List,只读
val list2 = mutableListOf<Int>()    //返回的是kotlin的MutableList,可读写
val list3 = arrayListOf<Int>()      //返回的是java的ArrayList,java的ArrayList是可读写的

setOf<Int>()
mutableSetOf<Int>()
hashSetOf<Int>()

mapOf<String, Int>()
mutableMapOf<String, Int>()
hashMapOf<String, Int>()//返回的是java的hashMap,java的hashMap是可读写的
list的函数定义
val list = listOf(1, 2, 3, 4, 5, 6)
list.any { it % 2 == 0 }         // 如果至少有一个元素符合给出的判断条件,则返回true
list.all { it % 2 == 0 }         // 如果全部的元素符合给出的判断条件,则返回true
list.count { it % 2 == 0 }       // 返回符合给出判断条件的元素总数
list.forEach { println(it) }     // 遍历所有元素,并执行给定的操作
list.forEachIndexed { index, value -> println("position $index contains a $value") }
                                 // 与 forEach ,但是我们同时可以得到元素的index
list.max()                       // 返回最大的一项,如果没有则返回null
list.maxBy { -it }               // 根据给定的函数返回最大的一项,如果没有则返回null
list.min()                       // 返回最小的一项,如果没有则返回null
list.minBy { -it }               // 根据给定的函数返回最小的一项,如果没有则返回null
list.sumBy { it % 2 }            // 返回所有每一项通过函数转换之后的数据的总和

list.drop(4)                     // 返回包含去掉前n个元素的所有元素的列表
list.filter { it % 2 == 0 }      // 过滤所有符合给定函数条件的元素

list.contains(2)                 // 如果指定元素可以在集合中找到,则返回true
list.elementAt(1)                // 返回给定index对应的元素
list.first { it % 2 == 0 }       // 返回符合给定函数条件的第一个元素
list.indexOf(4)                  // 返回指定元素的第一个index,如果不存在,则返回 -1 
list.indexOfFirst { it % 2 == 0 }             
                                 // 返回第一个符合给定函数条件的元素的index,如果没有符合则返回 -1 
list.indexOfLast{ it % 2 == 0 }  // 返回最后一个符合给定函数条件的元素的index,如果没有符合则返回 -1

list.reverse()                   // 返回一个与指定list相反顺序的list
list.sort()                      // 返回一个自然排序后的list
list..sortBy { it % 3 }          // 返回一个根据指定函数排序后的list

结合方法的一些实例:

val items = listOf(1, 2, 3, 4)
print(items.first())
print(items.last())
//filter接受一个函数为参数,函数类型为“(T) -> Boolean”
//filter会将集合中的每一个元素分别传入该函数,如果函数返回true,则保留该元素
items.filter { it % 2 == 0 } // 返回 [2, 4]

val rwList = mutableListOf(1, 2, 3)
//返回集合中非null的元素,这里会返回[1, 2, 3]
rwList.requireNoNulls()
//rwList.none { it > 6 }:集合中是否没有大于6的元素
if (rwList.none { it > 6 }) println("No items above 6") //输出“No items above 6”
//返回集合中的第一个元素,如果集合为空则返回null
val item = rwList.firstOrNull()

val readWriteMap = hashMapOf("foo" to 1, "bar" to 2)
println(readWriteMap["foo"]) //输出“1”

一般

val list = listOf(1, 2, 3, 4, 5, 6)

//只要集合中的任何一个元素满足条件(使得lambda表达式返回true),any函数就返回true
list.any {
    it >= 0
}

//集合中的全部元素都满足条件(使得lambda表达式返回true),all函数才返回true
list.all {
    it >= 0
}

//若集合中没有元素满足条件(使lambda表达式返回true),则none函数返回true
list.none {
    it < 0
}

//count函数的返回值为:集合中满足条件的元素的总数
list.count {
    it >= 0
}

遍历、极值

//遍历所有元素
list.forEach {
    print(it)
}

//同forEach,只是可以同时拿到元素的索引
list.forEachIndexed { index, value ->
    println("position $index contains a $value")
}

//返回集合中最大的元素,集合为空(empty)则返回null
list.max()

//返回集合中使得lambda表达式返回值最大的元素,集合为空(empty)则返回null
list.maxBy { it }

//返回集合中最小的元素,集合为空(empty)则返回null
list.min()

//返回集合中使得lambda表达式返回值最小的元素,集合为空(empty)则返回null
list.minBy { it }

过滤

//返回一个新List,去除集合的前n个元素
list.drop(2)
//返回一个新List,去除集合的后n个元素
list.dropLast(2)
//返回一个新List,去除集合中满足条件(lambda返回true)的第一个元素
list.dropWhile {
    it > 3
}
//返回一个新List,去除集合中满足条件(lambda返回true)的最后一个元素
list.dropLastWhile {
    it > 3
}

//返回一个新List,包含前面的n个元素
list.take(2)
//返回一个新List,包含最后的n个元素
list.takeLast(2)
//返回一个新List,仅保留集合中满足条件(lambda返回true)的第一个元素
list.takeWhile {
    it>3
}
//返回一个新List,仅保留集合中满足条件(lambda返回true)的最后一个元素
list.takeLastWhile {
    it>3
}

//返回一个新List,仅保留集合中满足条件(lambda返回true)的元素,其他的都去掉
list.filter {
    it > 3
}
//返回一个新List,仅保留集合中不满足条件的元素,其他的都去掉
list.filterNot {
    it > 3
}
//返回一个新List,仅保留集合中的非空元素
list.filterNotNull()

//返回一个新List,仅保留指定索引处的元素
list.slice(listOf(0, 1, 2))

元素

list.contains(2)

list.elementAt(0)
//返回指定索引处的元素,若索引越界,则返回null
list.elementAtOrNull(10)
//返回指定索引处的元素,若索引越界,则返回lambda表达式的返回值
list.elementAtOrElse(10) { index ->
    index * 2
}

//返回list的第一个元素
list.first()
//返回list中满足条件的第一个元素
list.first {
    it > 1
}
//返回list的第一个元素,list为empty则返回null
list.firstOrNull()
//返回list中满足条件的第一个元素,没有满足条件的则返回null
list.firstOrNull {
    it > 1
}

list.last()
list.last { it > 1 }
list.lastOrNull()
list.lastOrNull { it > 1 }

//返回元素2第一次出现在list中的索引,若不存在则返回-1
list.indexOf(2)
//返回元素2最后一次出现在list中的索引,若不存在则返回-1
list.lastIndexOf(2)
//返回满足条件的第一个元素的索引
list.indexOfFirst {
    it > 2
}
//返回满足条件的最后一个元素的索引
list.indexOfLast {
    it > 2
}

//返回满足条件的唯一元素,如果没有满足条件的元素或满足条件的元素多于一个,则抛出异常
list.single {
    it == 5
}
//返回满足条件的唯一元素,如果没有满足条件的元素或满足条件的元素多于一个,则返回null
list.singleOrNull {
    it == 5
}

如果要只对非空值执行某个操作,安全调用操作符可以与 let
一起使用:

val listWithNulls: List<String?> = listOf("A", null)
for (item in listWithNulls) {
     item?.let { println(it) } // 输出 A 并忽略 null
}
for.map{}
 //获取群成员的所有详细信息
                                    val ids = ArrayList<String>()
                                    for (i in timGroupMemberInfos.indices) {
                                        val timGroupMemberInfo = timGroupMemberInfos[i]
                                        val user = timGroupMemberInfo.user
                                        ids.add(user)
                                    }
替换成:

  //获取群成员的所有详细信息
                                    val ids = timGroupMemberInfos.indices
                                            .map { timGroupMemberInfos[it] }
                                            .map { it.user }
for.filter
val id = message.msgUniqueId
        for (msg in messageList) {
            if (msg.message.msgUniqueId == id){
                if(code==80001){
                    //发送内容包含敏感词
                    msg.desc = getString(R.string.chat_content_bad)
                    chatAdapter?.notifyDataSetChanged()
                }else if(code==114000){

                }
            }
        }
替换成:
 messageList
                .filter { it.message.msgUniqueId == id }
                .forEach {
                    when (code) {
                        80001 -> {
                            //发送内容包含敏感词
                            it.desc = getString(R.string.chat_content_bad)
                            chatAdapter?.notifyDataSetChanged()
                        }
                        114000//要发送的资源文件不存在
                        -> {
                        }
                    }
                }
 val names = mutableListOf("AbsZd", "Tdsd", "Xsdf", "Ssdfsd")
        names.filter { it.startsWith("A") }
                .sortedBy { it }
                .map { it.toUpperCase() }
                .forEach {
                    Log.e("forEach", it)
                }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容