一、ForEach
类型于Java的传统的写法
package net.println.kotlin.chapter5.builtins
/**
* @author:wangdong
* @description:Kotlin常见的高阶函数
*/
fun main(args: Array<String>) {
//定义一个list
val list = listOf(1,3,4,5,6,7,43,63)
//再定义一个arrayList
val newList = ArrayList<Int>()
//一个集合的映射
list.forEach{
val newElement = it * 2 + 3
newList.add(newElement)
}
newList.forEach(::println)
}
结果是:
5
9
11
13
15
17
89
129
二、Map
package net.println.kotlin.chapter5.builtins
/**
* @author:wangdong
* @description:Kotlin常见的高阶函数
*/
fun main(args: Array<String>) {
//定义一个list
val list = listOf(1,3,4,5,6,7,43,63)
//直接用map输出
list.map(::println) //纯粹用于迭代的话会影响性能,实现里面还有一个数组
//public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
// return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
//}
//再定义一个arrayList
//it就是list里面的元素
val newList = list.map {
it * 2 + 3
}
//将int转成double,Int代表list中的元素,是采用类的实例去调用的
val newList2 = list.map(Int::toDouble)
newList.forEach(::println)
newList2.forEach(::println)
}
三、Flatmap
package net.println.kotlin.chapter5.builtins
/**
* @author:wangdong
* @description:Kotlin常见的高阶函数
*/
fun main(args: Array<String>) {
//定义一个整型的集合
val list = listOf(
1..20,
2..15,
4..53
)
//如果想要得到平下来的例如[12...2023..5...],flatMap把集合中的集合打平
val flatList = list.flatMap {
it.map {
"No.$it + ,"
}
}
//1234567891011121314151617181920234567891011121314154567891011121314151617181920212
// 223242526272829303132333435363738394041424344454647484950515253
flatList.forEach(::print)
//No.1 + ,No.2 + ,No.3 + ,No.4 + ,No.5 + ,No.6 + ,No.7 + ,No.8 + ,No.9 + ,No.10 + ,No.11 + ,No.12 + ,No.13 + ,No.14 + ,No.15 + ,No.16 + ,No.17 + ,No.18 + ,No.19 + ,No.20 + ,No.2 + ,No.3 + ,No.4 + ,No.5 + ,No.6 + ,No.7 + ,No.8 + ,No.9 + ,No.10 + ,No.11 + ,No.12 + ,No.13 + ,No.14 + ,No.15 + ,No.4 + ,No.5 + ,No.6 + ,No.7 + ,No.8 + ,No.9 + ,No.10 + ,No.11 + ,No.12 + ,No.13 + ,No.14 + ,No.15 + ,No.16 + ,No.17 + ,No.18 + ,No.19 + ,No.20 + ,No.21 + ,No.22 + ,No.23 + ,No.24 + ,No.25 + ,No.26 + ,No.27 + ,No.28 + ,No.29 + ,No.30 + ,No.31 + ,No.32 + ,No.33 + ,No.34 + ,No.35 + ,No.36 + ,No.37 + ,No.38 + ,No.39 + ,No.40 + ,No.41 +
// ,No.42 + ,No.43 + ,No.44 + ,No.45 + ,No.46 + ,No.47 + ,No.48 + ,No.49 + ,No.50 + ,No.51 + ,No.52 + ,No.53 + ,
}
四、Reduce
package net.println.kotlin.chapter5.builtins
/**
* @author:wangdong
* @description:Kotlin常见的高阶函数
*/
fun main(args: Array<String>) {
//定义一个整型的集合
val list = listOf(
1..20,
2..15,
4..53
)
//如果想要得到平下来的例如[12...2023..5...],flatMap把集合中的集合打平
val flatList = list.flatMap{it}
flatList.forEach(::println)
//现在相求整数的和
println(flatList.reduce { acc, i -> acc + i }) //1754
//看一下reduce的源码
/*public inline fun <S, T: S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S {
val iterator = this.iterator()
if (!iterator.hasNext()) throw UnsupportedOperationException("Empty collection can't be reduced.")
var accumulator: S = iterator.next()
while (iterator.hasNext()) {
acc就是累加,上一次的结果加上这一次的数
accumulator = operation(accumulator, iterator.next())
}
return accumulator
}*/
//求(0..6)的阶乘
(0..6).map(::factorial).forEach(::println)
}
/**reduce求阶乘*/
//一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。 自然数n的阶乘写作n!。
//例如3的阶乘:1*2*3 = 6
fun factorial(n: Int): Int{
if (n == 0)return 1
//如果n >0,本次的acc*下一次的acc
return (1..n).reduce{acc,i -> acc * i}
}
五、Fold
package net.println.kotlin.chapter5.builtins
/**
* @author:wangdong
* @description:Kotlin常见的高阶函数
*/
fun main(args: Array<String>) {
//求(0..6)的阶乘
(0..6).map(::factorial).forEach(::println)
//1
//1
//2
//6
//24
//120
//720
//阶乘求和,并给予一个初始值,例如30意思是,阶乘和+30
println((0..6).map(::factorial).fold(30){
acc, i -> acc + i
})
//874+30=904
//将阶乘拼接成字符串
println((0..6).map(::factorial).fold(StringBuilder()){
acc, i -> acc.append(i).append(",")
})
//1,1,2,6,24,120,720,
//拼接字符串神奇
println((0..6).joinToString(","))
//0,1,2,3,4,5,6
}
/**reduce求阶乘*/
//一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。 自然数n的阶乘写作n!。
//例如3的阶乘:1*2*3 = 6
fun factorial(n: Int): Int{
if (n == 0)return 1
//如果n >0,本次的acc*下一次的acc
return (1..n).reduce{acc,i -> acc * i}
}