Kotlin開發五 Kotlin中集合常用函式式API
阿新 • • 發佈:2018-12-16
在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,熟練使用這些可以非常方便的提高我們的開發效率