Kotlin语法手册(二)

Kotlin语法手册(二)

在使用kotlin时,由于掌握的不够牢靠,好多时候也还是Java编程的习惯,浪费了kotlin提供的语言特性,方便性,间接性,在阅读一些Android开源库的时候,由于好多都是kotlin语法编写的,看的比较费劲,还得去查阅kotlin的语法,比较不方便,故把kotlin的语法记录下来,方便查阅温故,巩固自己的基础知识。

函数操作符

总数操作符

any

如果至少有一个元素符合给出的判断条件,则返回 true

    val list = listOf(1, 3, 5, 7, 9)
    println(list.any { it > 13 })  //false
    println(list.any { it > 7 })   //true

all

如果全部的元素符合给出的判断条件,则返回 true

    val list = listOf(1, 3, 5, 7, 9)
   
   println(list.all { it > 13 })  //false
   println(list.all { it > 0 })   //true

count

返回符合给出判断条件的元素总数

    val list = listOf(1, 3, 5, 7, 9)
    println(list.count { it > 7 })  //1
    println(list.count { it > 2 })  //4

fold

在一个初始值的基础上从第一项到最后一项通过一个函数累计所有的元素

fun main() {
    val list = listOf(1, 3, 5, 7, 9)
    println(list.fold(2) { total, next->
        println("$next , $total")
        next + total
    })
}
1 , 2//集合的第一个元素1,和初始化基础值2
3 , 3//集合的第二个元素3,上次累加的1+2=3
5 , 6//集合的第三个元素5,上次累加的3+3=6
7 , 11//集合的第四个元素7,上次累加的5+6=11
9 , 18//集合的第五个元素9,上次累加的7+11=18
27//外层println(list...)输入返回值9+18=27

foldRight

与 fold 一样,但顺序是从最后一项到第一项

    val list = listOf(1, 3, 5, 7, 9)
    println(list.foldRight(2) { next, total->
        println("$next , $total")
        next + total
    })
9 , 2
7 , 11
5 , 18
3 , 23
1 , 26
27

forEach

    val list = listOf(1, 3, 5, 7, 9)
    list.forEach { print(it + 1) } //246810

forEachIndexed

类似于 forEach ,同时可以得到元素的索引

val list = listOf(1, 3, 5, 7, 9)
list.forEachIndexed { index, value -> println("$index value is $value") }

//输入结果
0 value is 1
1 value is 3
2 value is 5
3 value is 7
4 value is 9

max

返回最大的一项,如果没有则返回null

val list = listOf(1, 3, 5, 7, 9)
println(list.max()) //9

maxBy

根据给定的函数返回最大的一项,如果没有则返回 null

val list = listOf(1, 3, 5, 7, 9)
println(list.maxBy { -it }) //1

min

返回最小的一项,如果没有则返回null

val list = listOf(1, 3, 5, 7, 9)
println(list.min()) //1

minBy

根据给定的函数返回最小的一项,如果没有则返回null

val list = listOf(1, 3, 5, 7, 9)
println(list.minBy { -it }) //9

none

如果没有任何元素与给定的函数匹配,则返回true

val list = listOf(1, 3, 5, 7, 9)
println(list.none { it > 10 }) //true

reduce

与 fold 一样,但是没有一个初始值。通过一个函数从第一项到最后一项进行累计

val list = listOf(1, 3, 5, 7, 9)
    println(list.reduce { total, next ->
        println("$next , $total")
        total + next
    })
 3 , 1
 5 , 4
 7 , 9
 9 , 16
 25

reduceRight

与 reduce 一样,但是顺序是从最后一项到第一项

val list = listOf(1, 3, 5, 7, 9)
    println(list.reduceRight { next, total ->
        println("$next , $total")
        total + next
    })

 7 , 9
 5 , 16
 3 , 21
 1 , 24
 25

sumBy

返回所有每一项通过函数转换之后的数据的总和

val list = listOf(1, 3, 5, 7, 9)
println(list.sumBy { it + 1 }) //30

过滤操作符

drop

返回包含去掉前n个元素的所有元素的列表

val list = listOf(1, 3, 5, 7, 9)
println(list.drop(2)) //[5, 7, 9]

dropWhile

返回从第一个开始不符合给定函数的元素起之后的列表

val list = listOf(1, 3, 5, 7, 9, 2)
println(list.dropWhile { it < 4 }) //第1、2元素不符合函数,故返回的列表时[5, 7, 9, 2]

dropLastWhile

从最后一项开始,返回从开始不符合给定函数的元素起之后的列表

val list = listOf(10, 1, 3, 5, 7, 9)
println(list.dropLastWhile { it > 4 }) //[10, 1, 3]

filter

过滤所有符合给定函数条件的元素

val list = listOf(1, 3, 5, 7, 9, 2)
println(list.filter { it < 4 }) //[1, 3, 2]

filterNot

过滤所有不符合给定函数条件的元素

val list = listOf(1, 3, 5, 7, 9, 2)
println(list.filterNot { it < 4 }) //[5, 7, 9]

filterNotNull

过滤所有元素中不是null的元素

val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.filterNotNull()) //[1, 3, 5, 7, 9, 2]

slice

过滤一个list中指定index的元素

val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.slice(listOf(0, 3))) //[1, 7]

take

返回从第一个开始的n个元素

val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.take(2)) //[1, 3]

takeLast

返回从最后一个开始的n个元素

val list = listOf(1, 3, 5, 7, 9, 2, null)
println(list.takeLast(2)) //[2, null]

takeWhile

返回从第一个开始符合给定函数条件的元素

val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.takeWhile { it > 2 }) //[]第一个元素就不符合
println(list.takeWhile { it > 0 }) //[1, 3, 5]

映射操作符

flatMap

遍历所有的元素,为每一个创建一个集合,最后把所有的集合放在一个集合中

val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.flatMap { listOf(it, it + 1) }) //[1, 2, 3, 4, 5, 6, -1, 0, 7, 8, 9, 10, 2, 3]

groupBy

返回一个根据给定函数分组后的map

val list = listOf(1, 3, 5, -1, 7, 9, 2)
    println(list.groupBy { listOf(it) }) //{[1]=[1], [3]=[3], [5]=[5], [-1]=[-1], [7]=[7], [9]=[9], [2]=[2]}
    println(list.groupBy { listOf(it, it + 1) }) //{[1, 2]=[1], [3, 4]=[3], [5, 6]=[5], [-1, 0]=[-1], [7, 8]=[7], [9, 10]=[9], [2, 3]=[2]}

map

返回一个每一个元素根据给定的函数转换所组成的List。

val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.map { listOf(it) }) //[[1], [3], [5], [-1], [7], [9], [2]]
println(list.map { listOf(it, it + 1) }) //[[1, 2], [3, 4], [5, 6], [-1, 0], [7, 8], [9, 10], [2, 3]]

mapIndexed

返回一个每一个元素根据给定的包含元素index的函数转换所组成的List

val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.mapIndexed { index, value -> index }) //[0, 1, 2, 3, 4, 5, 6]
println(list.mapIndexed { index, value -> index * value }) //[0, 3, 10, -3, 28, 45, 12]

mapNotNull

返回一个每一个非null元素根据给定的函数转换所组成的List

val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.mapNotNull { it }) //[1, 3, 5, -1, 7, 9, 2]

元素操作符

contains

如果指定元素可以在集合中找到,则返回true

val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.contains(3)) //true
println(list.contains(13)) //false

elementAt

返回给定index对应的元素,如果index数组越界则会抛出 IndexOutOfBoundsException

val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.elementAt(3)) //-1
println(list.elementAt(6)) //null

elementAtOrElse

返回给定index对应的元素,如果index数组越界则会根据给定函数返回默认值

val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.elementAtOrElse(3, { it * 2 }))  //-1
println(list.elementAtOrElse(16, { it * 2 })) //越界,故返回32

elementAtOrNull

返回给定index对应的元素,如果index数组越界则会返回null

val list = listOf(1, 3, 5, -1, 7, 9, null, 2)
println(list.elementAtOrNull(3))  //-1
println(list.elementAtOrNull(16)) //null

first

返回符合给定函数条件的第一个元素

val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.first { it % 3 == 0 })  //3

firstOrNull

返回符合给定函数条件的第一个元素,如果没有符合则返回null

val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.firstOrNull { it % 3 == 0 })  //3
println(list.firstOrNull { it % 8 == 0 })  //null

indexOf

返回指定元素的第一个index,如果不存在,则返回 -1

val list = listOf(1, 3, 5, -1, 7, 9, 2)
println(list.indexOf(5))  //2
println(list.indexOf(12)) //-1

indexOfFirst

返回第一个符合给定函数条件的元素的index,如果没有符合则返回 -1

val list = listOf(1, 3, 5, 1, 7, 9, 2)
println(list.indexOfFirst { it % 2 == 0 })   //6
println(list.indexOfFirst { it % 12 == 0 })  //-1

indexOfLast

返回最后一个符合给定函数条件的元素的index,如果没有符合则返回 -1

val list = listOf(1, 3, 5, 6, 7, 9, 2)
println(list.indexOfLast { it % 2 == 0 })   //6
println(list.indexOfLast { it % 12 == 0 })  //-1

last

返回符合给定函数条件的最后一个元素

val list = listOf(1, 3, 5, 6, 7, 9, 2)
println(list.last { it % 2 == 0 })   //2
println(list.last { it % 3 == 0 })   //9

lastIndexOf

返回指定元素的最后一个index,如果不存在,则返回 -1

val list = listOf(1, 3, 2, 6, 7, 9, 2)
println(list.lastIndexOf(2))    //6
println(list.lastIndexOf(12))   //-1

lastOrNull

返回符合给定函数条件的最后一个元素,如果没有符合则返回null

val list = listOf(1, 3, 2, 6, 7, 9, 2)
println(list.lastOrNull { it / 3 == 3 })    //9
println(list.lastOrNull { it == 10 })       //null

single

返回符合给定函数的单个元素,如果没有符合或者超过一个,则抛出异常

val list = listOf(1, 9, 2, 6, 7, 9, 2)
println(list.single { it % 7 == 0 })  //7
println(list.single { it == 2 })      //IllegalArgumentException

singleOrNull

返回符合给定函数的单个元素,如果没有符合或者超过一个,则返回null

val list = listOf(1, 9, 2, 6, 7, 9, 2)
println(list.singleOrNull { it % 7 == 0 })  //7
println(list.singleOrNull { it == 2 })      //null

生产操作符

partition

把一个给定的集合分割成两个,第一个集合是由原集合每一项元素匹配给定函数条 件返回 true 的元素组成,第二个集合是由原集合每一项元素匹配给定函数条件返回 false 的元素组成

val list = listOf(1, 9, 2, 6, 7, 9, 2)
val (list1, list2) = list.partition { it % 2 == 0 }
println(list1)  //[2, 6, 2]
println(list2)  //[1, 9, 7, 9]

plus

返回一个包含原集合和给定集合中所有元素的集合,因为函数的名字原因,我们可以使用 + 操作符

val list1 = listOf(1, 9, 2, 6, 7, 9, 2)
val list2 = listOf(1, 2, 4, 6, 8, 10)
println(list1.plus(list2)) //[1, 9, 2, 6, 7, 9, 2, 1, 2, 4, 6, 8, 10]
println(list1 + list2)  //[1, 9, 2, 6, 7, 9, 2, 1, 2, 4, 6, 8, 10]

zip

返回由 pair 组成的List,每个 pair 由两个集合中相同index的元素组成。这个返回的List的大小由最小的那个集合决定

val list1 = listOf(1, 9, 2, 6, 7, 9, 2)
val list2 = listOf(1, 2, 4, 6, 8, 10)
val list3 = list1.zip(list2)
println(list3.javaClass)
println(list3.get(0).javaClass)
println("${list3.get(0).first} , ${list3.get(0).second}")
list3.forEach { println(it) }
class java.util.ArrayList
class kotlin.Pair
1 , 1
(1, 1)
(9, 2)
(2, 4)
(6, 6)
(7, 8)
(9, 10)

unzip

从包含pair的List中生成包含List的Pair

val list1 = listOf(Pair("leavesC", 1), Pair("leavesC_2", 2), Pair("leavesC_3", 3))
val list2 = list1.unzip()
println(list2.javaClass)
println(list2.first)
println(list2.second)

顺序操作符

reverse

返回一个与指定list相反顺序的list

val list1 = listOf(Pair("leavesC", 1), Pair("leavesC_2", 2), Pair("leavesC_3", 3))
val list2 = list1.reversed()
println(list2)      //[(leavesC_3, 3), (leavesC_2, 2), (leavesC, 1)]

sort

返回一个自然排序后的list

val list1 = listOf(2, 4, 1, 9, 5, 10)
val list2 = list1.sorted()
println(list2) //[1, 2, 4, 5, 9, 10]

val list3 = listOf("a", "c", "ab", "b", "cdd", "cda")
val list4 = list3.sorted()
println(list4) //[a, ab, b, c, cda, cdd]

sortBy

返回一个根据指定函数排序后的list

val list1 = listOf(2, 4, 1, 9, 5, 10)
val list2 = list1.sortedBy { it - 3 }
println(list2) //[1, 2, 4, 5, 9, 10]

sortDescending

返回一个降序排序后的List

val list1 = listOf(2, 4, 1, 9, 5, 10)
val list2 = list1.sortedDescending()
println(list2) //[10, 9, 5, 4, 2, 1]

sortDescendingBy

返回一个根据指定函数降序排序后的list

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

推荐阅读更多精彩内容

  • [TOC] 好吧..用MarkDown写的.. # Kotlin 标准库常用扩展函数集合 ## apply * a...
    wspisces阅读 4,068评论 1 5
  • 1、定义包 和Java不同的是Kotlin例如,Test.kt文件放在项目的com.kotlin.demo文件夹下...
    揭穿套路阅读 477评论 0 0
  • Kotlin语法手册(一) 在使用kotlin时,由于掌握的不够牢靠,好多时候也还是Java编程的习惯,浪费了ko...
    69451dd36574阅读 675评论 0 0
  • 本来这节不应该放这里的,因为在公司做一个小项目练手的时候碰到了些坑,使用了一个List,结果怎么也找不到添加ite...
    风少侠阅读 1,027评论 0 2
  • 在 Kotlin 中的变量、常量以及注释多多少少和 Java 语言是有着不同之处的。下面详细的介绍 Kotlin ...
    驰同学阅读 880评论 0 2