1. 程式人生 > >Kotlin開發五 Kotlin中集合常用函式式API

Kotlin開發五 Kotlin中集合常用函式式API

在kotlin中有一些常用的對集合進行操作的函式式API,掌握他們可以大大提高程式設計效率,這些API與java8中的 Stream API類似。下面主要講解以下幾大類

1 filter 和 map

filter主要用作過濾器(對集合元素),它的返回值也是一個集合,定義如下:

public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

可以看到,返回的也是一個集合,並且型別與原型別相同,用法如下:

class User(val id:Int,var name:String,var age:Int,val sex:String){

    init {
        //println(toString())
    }

    override fun toString(): String {
        return "User(id=$id, name='$name', age=$age, sex='$sex')"
    }
}
fun main(args: Array<String>) {

    val list = arrayListOf<User>(User(1,"張三",14,"男"),User(2,"李四",16,"女"),
            User(3,"王五",65,"男"),User(4,"趙六",24,"男")
            ,User(5,"向七",89,"女"),User(6,"王八",6,"女")
            ,User(7,"韓九",27,"男"),User(8,"陳10",35,"女"))

    //測試filter
    val filterList = list.filter { it.age > 30 }
    println(filterList)
}

輸出:

[User(id=3, name='王五', age=65, sex='男'), User(id=5, name='向七', age=89, sex='女'), User(id=8, name='陳10', age=35, sex='女')]

map主要對集合的元素做對映,可以對映成不同的型別,例如Int到String,定義如下

public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}

可以看到,返回值是對映成的新型別的集合,用法如下

    //測試map
    val mapList = list.map { it.name }
    println(mapList)

輸出

[張三, 李四, 王五, 趙六, 向七, 王八, 韓九, 陳10]

2 all any count find

以上4個都是對集合的所有元素檢查是否符合某個條件(或者它的變種,是否存在符合的元素等)

all檢查集合中是否所有元素都符合某個條件

public inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean {
    if (this is Collection && isEmpty()) return true
    for (element in this) if (!predicate(element)) return false
    return true
}

可以看到返回值是Boolean型別,都符合返回為true,有一個不符合為true,用法如下:

    //測試all
    val all = list.all { it.age > 10 }
    println(all)

輸出:

false

any檢測集合中是否至少存在一個元素滿足條件,如果是就返回true

public inline fun <T> Iterable<T>.any(predicate: (T) -> Boolean): Boolean {
    if (this is Collection && isEmpty()) return false
    for (element in this) if (predicate(element)) return true
    return false
}

用法如下:

    //測試any
    val any = list.any { it.age > 10 }
    println(any)

輸出

true

count 檢查集合中有多少個元素滿足該條件,返回值是Int

public inline fun <T> Iterable<T>.count(predicate: (T) -> Boolean): Int {
    if (this is Collection && isEmpty()) return 0
    var count = 0
    for (element in this) if (predicate(element)) count++
    return count
}

用法如下:

    //測試count
    val count = list.count { it.age > 25 }
    println(count)

輸出

4

find找到集合中第一個滿足條件的元素,返回值是集合元素型別,可能為null

@kotlin.internal.InlineOnly
public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? {
    return firstOrNull(predicate)
}

用法如下:

    //測試find
    val find = list.find { it.age > 25 }
    println(find)

輸出

User(id=3, name='王五', age=65, sex='男')

3 groupBy

groupBy主要用作將集合按照給定的條件進行分組,即將集合轉為map

public inline fun <T, K> Iterable<T>.groupBy(keySelector: (T) -> K): Map<K, List<T>> {
    return groupByTo(LinkedHashMap<K, MutableList<T>>(), keySelector)
}

可以看到,返回的是一個map,key型別就是lambda的返回值型別,value是集合元素的List,用法如下:

    //測試groupBy
    val groupBy = list.groupBy { it.sex}
    println(groupBy)

輸出

{男=[User(id=1, name='張三', age=14, sex='男'), User(id=3, name='王五', age=65, sex='男'), User(id=4, name='趙六', age=24, sex='男'), User(id=7, name='韓九', age=27, sex='男')], 女=[User(id=2, name='李四', age=16, sex='女'), User(id=5, name='向七', age=89, sex='女'), User(id=6, name='王八', age=6, sex='女'), User(id=8, name='陳10', age=35, sex='女')]}

4 flatMap

flatMap先對集合中的某個元素對映成集合,再將所有對映成的集合做一個元素平鋪,即做一個list

public inline fun <T, R> Iterable<T>.flatMap(transform: (T) -> Iterable<R>): List<R> {
    return flatMapTo(ArrayList<R>(), transform)
}

返回集合元素對映的集合的list 用法如下:

fun main(args: Array<String>) {

    val list = arrayListOf<User>(User(1,"張三",14,"男"),User(2,"李四",16,"女"),
            User(3,"王五",65,"男"),User(4,"趙六",24,"男")
            ,User(5,"向七",89,"女"),User(6,"王八",6,"女")
            ,User(7,"韓九",27,"男"),User(8,"陳10",35,"女"))

	....
    var citys = arrayListOf<City>()
    citys.add(City("CD", arrayListOf(User(1,"張三",14,"男"),User(2,"李四",16,"女"),
            User(3,"王五",65,"男"))))
    citys.add(City("CD", arrayListOf(User(5,"向七",89,"女"),User(6,"王八",6,"女"))))
    //測試flatMap
    val flatmap = citys.flatMap {
        it.people
    }
    println(flatmap)
}

class City(val name:String,val people:List<User>){

    override fun toString(): String {
        return "City(name='$name', people=$people)"
    }
}

輸出:

[User(id=1, name='張三', age=14, sex='男'), User(id=2, name='李四', age=16, sex='女'), User(id=3, name='王五', age=65, sex='男'), User(id=5, name='向七', age=89, sex='女'), User(id=6, name='王八', age=6, sex='女')]

以上就是Kotlin中集合常用的一些API,熟練使用這些可以非常方便的提高我們的開發效率