使用kotlin一年多了得滤,基本的開發(fā)都能用陨献,但是kotlin的很多蜜糖高階函數(shù)還沒有用起來。懂更。眨业。有時候就算看過急膀,也很容易忘記。龄捡。卓嫂。所以就寫篇文章 對應(yīng)詳細的代碼demo,以便下次能快速看懂理解使用方法聘殖。晨雳。
高階函數(shù)
111.png
forEach 便利
fun main(args: Array<String>) {
var list = listOf(1, 2, 3, 4, 5, 6)
list.forEach(::println)
val newList = arrayListOf<String>() --->1,2,3,4,5,6
list.forEach {
newList.add((it * 2).toString()) --->2,4,6,8,10,12
}
newList.forEach(::println)
}
map 變換
fun main(args: Array<String>) {
val list = listOf(1, 2, 3, 4, 5, 6)
val newList = list.map {
//對集合中的數(shù)據(jù)進行操作,然后賦值給新的集合
(it * 2).toString()
}.forEach(::println) //2 4 6 8 10 12
val doubleList = list.map {
it.toDouble()
}.forEach(::print) //1.0 2.0 3.0 4.0 5.0 6.0
//函數(shù)作為參數(shù)的第二種方式調(diào)用 類名::方法名
val doubleList2 = list.map(Int::toDouble).forEach(::print) ////1.0 2.0 3.0 4.0 5.0 6.0
}
flatMap 對集合的集合進行變換
fun main(args: Array<String>) {
val list = arrayOf(
1..5,
50..55
)
//把多個數(shù)組集合變成一個數(shù)組奸腺,并且對數(shù)據(jù)進行變換
val mergeList = list.flatMap { intRange -> //集合內(nèi)的集合 1..5 , 50..55
intRange.map { intElement -> //集合內(nèi)集合遍歷 1,2,3,4,5
"No.$intElement"
}
}
//No.1 , No.2 , No.3 , No.4 , No.5 , No.50 , No.51 , No.52 , No.53 , No.54 , No.55 ,
mergeList.forEach { print("$it , ") }
println()
//直接多個數(shù)組集合變換成一個結(jié)集合
val newList = list.flatMap {
it
}
//1 , 2 , 3 , 4 , 5 , 50 , 51 , 52 , 53 , 54 , 55 ,
newList.forEach { print("$it , ") }
}
reduce 餐禁,fold,foldRight 倒敘, joinToString轉(zhuǎn)換字符去
fun main(args: Array<String>) {
val list = arrayOf(
1..5,
2..3
)
val newList = list.flatMap {
it
}
//1 , 2 , 3 , 4 , 5 , 50 , 51 , 52 , 53 , 54 , 55 ,
newList.forEach { print("$it , ") }
//求和 reduce 返回值必須是 acc類型
println(newList.reduce { acc, i -> acc + i }) //20
//帶基數(shù)求和
println(newList.fold(10) { acc, i -> acc + i }) //30
//fold 返回值類型是 "基數(shù)" 對應(yīng)的類型,比如 StringBuilder hello--1--2--3--4--5--2--3--
println(newList.fold(StringBuilder("hello--")) { acc, i -> acc.append(i).append("--") }) //30
//拼接字符串 1---, 2---, 3---, 4---, 5---, 2---, 3---
println(newList.joinToString { "$it---" })
}
filter 篩選 filterIndexed 下標(biāo)篩選
fun main(args: Array<String>) {
val list = arrayOf(
1..5,
2..3
)
val newList = list.flatMap {
it
}
//篩選 集合中數(shù)據(jù) > 2的item
val filterList = newList.filter { it > 2 }
filterList.forEach(::print) //3453
//篩選 集合中下標(biāo)是奇數(shù)item
val filterIndexList = newList.filterIndexed { index, i -> index % 2 == 0; }
filterIndexList.forEach { print(it) } //1 3 5 3
}
takeWhile 截至條件
fun main(args: Array<String>) {
val list = arrayOf(
1..5,
2..3
)
val newList = list.flatMap {
it
}
//截取符合條件的前面的所以的item 1234523突照,< 3 帮非,12
// newList.takeWhile { it < 3 }.forEach { print(it) } // 1 2
//返回包含 最后[n]元素 的列表。讹蘑,包含最后2個元素
newList.takeLast(2).forEach(::print) // 23
}
?. 判空執(zhí)行末盔,let 類作為參數(shù),apply 類擴展
fun main(args: Array<String>) {
val person = getPerson()
println(person?.name) //判空處理座慰,如果不為空 執(zhí)行后面的方法
person?.let { //類作為參數(shù) it
println(it.name)
println(it.age)
it.work()
}
person?.apply { //類擴展 可以直接調(diào)用
println(name)
println(age)
work()
}
}
fun getPerson(): Person? {
return Person("shadow", 18)
}
class Person(val name: String, val age: Int) {
fun work() {
println("hello shadow")
}
}
with
定義:fun <T, R> with(receiver: T, block: T.() -> R): R
功能:將對象作為函數(shù)的參數(shù)庄岖,在函數(shù)內(nèi)可以通過 this指代該對象。返回值為函數(shù)的最后一行或return表達式角骤。
fun main(args: Array<String>) {
val br = BufferedReader(FileReader("shadow.txt"))
br.readLine()
br.read()
//使用給定的[receiver]調(diào)用指定的函數(shù)[block]并返回其結(jié)果。
/* with(br) {
var readLine: String?
while (true) {
readLine = readLine() ?: break //如果不為空 就執(zhí)行前面的表達式 否則執(zhí)行后面的表達式
println(readLine)
}
close()
}*/
}
user
use函數(shù)會自動關(guān)閉調(diào)用者(無論中間是否出現(xiàn)異常)
Kotlin的File對象和IO流操作變得行云流水
use函數(shù)內(nèi)部實現(xiàn)也是通過try-catch-finally塊捕捉的方式心剥,所以不用擔(dān)心會有異常拋出導(dǎo)致程序退出
close操作在finally里面執(zhí)行邦尊,所以無論是正常結(jié)束還是出現(xiàn)異常,都能正確關(guān)閉調(diào)用者
BufferedReader(FileReader("build.gradle")).use {
var readLine: String?
while (true) {
readLine = readLine() ?: break //如果不為空 就執(zhí)行前面的表達式 否則執(zhí)行后面的表達式
println(readLine)
}
}
閉包函數(shù)
閉包函數(shù) 一個函數(shù)的返回值是函數(shù)优烧,函數(shù)的內(nèi)部包含另一個函數(shù)蝉揍,可以是有參無參的匿名函數(shù)
fun main(args: Array<String>) {
val mm = aaa()
println(mm())
println(mm())
println(mm())
println(mm())
println(mm())
val kk = bbb()
println(kk("shadow")) //shadow --- 1
println(kk("shadow")) //shadow --- 2
println(kk("shadow")) //shadow --- 3
println(kk("shadow")) //shadow --- 4
println(kk("shadow")) //shadow --- 5
}
//閉包函數(shù) 就是函數(shù)作為返回參數(shù)
fun aaa(): () -> (Int) {
var current = 10
return fun(): Int {
return current++
}
}
fun bbb(): (String) -> (String) {
var current = 0;
return fun(str: String): String {
current++;
return "$str --- $current";
}
}