Kotlin集合内置函数

1.LINQ-风格

    val words = "A long time ago in a galaxy far far away".split(" ")
    val shortWords = mutableListOf<String>()
    words.getShortWordsTo(shortWords, 3)
    println(shortWords)//[ago, in, far, far]

getShortWordsTo

fun List<String>.getShortWordsTo(shortWords: MutableList<String>, maxLength: Int) {
    this.filterTo(shortWords) { it.length <= maxLength }
    val articles = setOf("a", "A", "an", "An", "the", "The")
    shortWords -= articles //removeAll
}

上面逻辑看起来似乎不太直观
LINQ:

    "A long time ago in a galaxy far far away"
        .split(" ")
        .filter { it.length <= 3 }
        .toMutableList()
        .let {
            val articles = setOf("a", "A", "an", "An", "the", "The")
            it.removeAll(articles)
            it
        }
        .run { println(this) }

apply代替let let返回block() 而apply返回this

    "A long time ago in a galaxy far far away"
        .split(" ")
        .filter { it.length <= 3 }
        .toMutableList()
        .apply {
            removeAll(setOf("a", "A", "an", "An", "the", "The"))
        }
        .joinToString(separator = "-", prefix = "{", postfix = "}")
        .run { println(this) }

2.kotlin标准库中内置的Iterable的扩展函数
准备容器数据

data class Product(val name: String, val price: Double, val isChecked: Boolean)
fun main() {
    var list = ArrayList<Product>()
    repeat(5) {
        list.add(Product("gaom$it", it.toDouble(), it >= 2))
    }
}

forEachIndexed

//带游标遍历 解构
    list.forEachIndexed { index, (name, _, isChecked) -> println("$index={$name, $isChecked}") }

any/all/count

    println(list.any { !it.isChecked })//任何item没有选中 , 则全选按钮置为 -未选中状态
    println(list.all { it.isChecked })//所有item选中 , 则全选按钮置为 -选中状态
    println(list.count { it.isChecked })// 选中状态商品数量

计算所选商品价格

    println(
        list
            .filter { it.isChecked }
            .map { it.price }//转换类型
//            .reduce{} //reduce与fold类似,但是没有初始值
            .fold(.0) { total, next -> total + next }
        //fold 折叠 计算init为初始值 可传入任意类型
    )

计算所选商品价格

    println(list
        .filter { it.isChecked }
        .sumByDouble { it.price })

partition 按条件分割trueList,falseList

    list.partition { it.isChecked }
        .run {
            //first list
            println(first.map { it.price }
                .fold(.0) { total, next -> total + next })
            //second list
            println(second.map { it.price }
                .fold(.0) { total, next -> total + next }
            )
        }

操作符 & 中缀

//操作符 -=
    val aList = mutableListOf(1, 2, 3)
    val bList = mutableListOf(1, 2, 3, 4)
    bList -= aList
    aList + listOf(1, 2)

//中缀 zip
    listOf(1, 2).zip(listOf(7, 8))//(1, 7) (2, 8)
    listOf(1, 2) zip listOf(7, 8)

list转换成map associate函数

    val numbers = listOf("one", "two", "three", "four")
    println(numbers.associateWith { value -> value.length })//key默认是集合中的元素 , 要求返回一个value
    //{one=3, two=3, three=5, four=4}

    println(numbers.associateBy { key -> key.first().toUpperCase() })//value默认是集合中的元素 , 要求返回一个key
    //{O=one, T=three, F=four}
    println(
        numbers.associateBy(
            keySelector = { it.first().toUpperCase() },
            valueTransform = { it.length })
    )
    //{O=3, T=5, F=4}

    val names = listOf("Alice Adams", "Brian Brown", "Clara Campbell")
    println(names.associate { name -> name.split(" ").let { it[0] to it[1] } })
    //{Alice=Adams, Brian=Brown, Clara=Campbell}

去重

    val distinctList = mutableListOf(0, 1, 2, 2, 3, 4, 4)
    println(distinctList.distinct()) // [0, 1, 2, 3, 4]
    //根据指定元素 而不是条件!!! it%2==0
    println(distinctList.distinctBy { it })

distinctBy源码

    public inline fun <T, K> Iterable<T>.distinctBy(selector: (T) -> K): List<T> {
    val set = HashSet<K>()
    val list = ArrayList<T>()
    for (e in this) {
        val key = selector(e)
        if (set.add(key))//HashSet作用就是去重复数据
            list.add(e)
    }
    return list
}

产生的最大值的原始元素

    val listMaxBy = listOf(1, 2, 2, 4)
    println("maxBy=${listMaxBy.maxBy { -it }}")//maxBy=1

none

val listMaxBy = listOf(1, 2, 2, 4)
println("none=${listMaxBy.none {  it==5 }}")//true

orEmpty

val listMaxBy = listOf(1, 2, 2, 4)
println("orEmpty=${listMaxBy.orEmpty()}")//orEmpty=[1, 2, 2, 4]

orEmpty源码

public inline fun <T> List<T>?.orEmpty(): List<T> = this ?: emptyList()

slice 相当于 Java subList

    val listMaxBy = listOf(1, 2, 2, 4)
    println("slice1=${listMaxBy.slice(1..3)}")//slice1=[2, 2, 4]
    println("slice2=${listMaxBy.slice(listOf(1,2))}")//slice2=[2, 2]

take 舍弃目标index之后的数据

val listMaxBy = listOf(1, 2, 2, 4)
println("take=${listMaxBy.take(3)}")//take=[1, 2, 2]

flatten 平铺

    val numberSets1 = listOf(setOf(1, 2, 3), setOf(4, 5, 6), setOf(7, 8))
    println("flatten=${numberSets1.flatten()}")//[1, 2, 3, 4, 5, 6, 7, 8]

rangeTo

    val numbersToList = (1..100).toList()

joinToString

    val numbersToList = (1..100).toList()
    println("numbersToList=${numbersToList.joinToString(limit = 10, truncated = "<...>")}")
    //1, 2, 3, 4, 5, 6, 7, 8, 9, 10, <...>

sequence 惰性序列操作

println(people.asSequence()
            .map { it.name } //中间操作
            .filter { it.startsWith("A") } //中间操作
            .toList()) //末端操作
//找到第一个平方大于3的数,输出它的平方
println(listOf(1, 2, 3, 4).asSequence()
        .map { it * it }
        .find { it > 3 })

takeWhile

    val list = listOf(1, 2, 3, 4, 5, 6, 7, 9)
    list.takeWhile { it <= 3 }.forEach(::println)

解构声明

    val (c, ca) = "param=car=c".split("=").reversed()
    println("c=$c")
    println("ca=$ca")

foreach的坑

fun forEach0() {
    val list = listOf(1, 2, 3, 4)
    list.forEach {
        println("it=$it")
        if (it == 3) return //break不能在这里使用
    }
    println("Hello") //如果这样return, 将会执行不到这里
//>>>it=1
//>>>it=2
//>>>it=3
}

fun forEach1() {
    val list = listOf(1, 2, 3, 4)
    list.forEach block@{
        println("it=$it")
        if (it == 3) return@block //手动加标记  //lambda依然执行
    }
    println("Hello")
    //>>>it=1
    //>>>it=2
    //>>>it=3
    //>>>it=4
    //>>>Hello
}

fun forEach2() {
    val list = listOf(1, 2, 3, 4)
    list.forEach {
        println("it=$it")
        if (it == 3) return@forEach // forEach做为标记 //lambda依然执行
    }
    println("Hello")
    //>>>it=1
    //>>>it=2
    //>>>it=3
    //>>>it=4
    //>>>Hello
}


fun forEach3() {
    val list = listOf(1, 2, 3, 4)
    list.let {
        it.forEach {
            println("it=$it")
            if (it == 3) return@let //let方法做为标记 其他作用域函数皆可
        }
    }
    println("Hello")
    //>>>it=1
    //>>>it=2
    //>>>it=3
    //>>>Hello
}

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

推荐阅读更多精彩内容

  • layout: posttitle: "kotlin-高阶函数"subtitle: "这个世...
    東方月初阅读 375评论 0 0
  • 1.函数引用 kotlin中函数引用跟c++中的方法指针很相似,函数引用可以像其他类型的引用一样作为方法的参数和返...
    懒癌患者2018阅读 4,617评论 0 7
  • 1.函数参数的默认值 (1).基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
    赵然228阅读 688评论 0 0
  • 前言 最近使用kotlin语言开发了新的项目,kotlin的一些特性和大量的语法糖相当好用,相比于java,开发效...
    SirWwh阅读 2,353评论 1 2
  • 简述: 今天带来的是Kotlin浅谈系列的第八讲,这讲我们一起来聊聊Kotlin这门语言对函数式编程的支持。我们都...
    熊喵先森阅读 1,146评论 2 4