36. 常用的高阶函数
2017-11-27 本文已影响43人
厚土火焱
forEach 、map
利用 forEach 和 map 对数组进行操作
package com.cofox.kotlin.mydo.HeighterCodeFunction
import java.util.function.IntToDoubleFunction
/**
* chapter01
* @Author: Jian Junbo
* @Email: junbojian@qq.com
* @Create: 2017/11/26 16:36
* Copyright (c) 2017 Jian Junbo All rights reserved.
*
* Description:
*/
fun main(args: Array<String>) {
val list = listOf(1,2,3,4,5,6,7)
val newList = list.map {
it * 2 + 3
}
val newList2 = list.map(Int::toDouble)
newList.forEach(::println)
newList2.forEach(::println)
}
可以利用 map 对数组的元素进行运算和编辑。然后利用 forEach 遍历并 println。
运行结果
5
7
9
11
13
15
17
1.0
2.0
3.0
4.0
5.0
6.0
7.0
数组本身也有可能更复杂一点
val list = listOf(
1..10,
2..5,
1017..1028
)
这是一个内部有三个序列的数组。
通常我们这样来把这个数组扁平化。
val flatlistUsually = list.flatMap {
it.map {
"No.$it"
}
}
不过,这里面的 2 个 it 并不是同一个东西。我们可以写的更清晰一些。
val flatlist = list.flatMap { intRange ->
intRange.map { intElement ->
"No.$intElement"
}
}
现在看出来了,2 个 it,是包含关系,这里用 intRange 和 intElement 来区分。
reduce,joinToString
简单的输出
println(flatlist)
val flatlist2 = list.flatMap { it }
val reducelist = flatlist2.reduce { acc, i -> acc + i }
println(reducelist)
println((1..5).joinToString(","))
可以直接输出。
也可以生成新数组,然后对新数组使用 reduce 来进行数组元素的运算。
而joinToString是一个简单好用的小函数。
fold,foldRight,filter,filterIndexed,takeWhile
可以按顺序和倒序来显示数据
/**阶乘*/
fun factorial(n: Int): Int {
if (n == 0) return 1
return (1..n).reduce { acc, i -> acc * i }
}
//顺序
println((0..6).map(::factorial).fold(StringBuilder()) { acc, i -> acc.append(i).append(",") })
//倒序
println((0..6).map(::factorial).foldRight(StringBuilder()) { i, acc -> acc.append(i).append(",") })
可以对数组元素进行过滤
//过滤偶数
println((0..6).map(::factorial).filter { it % 2 == 0 })
可以对指定数组元素位置进行过滤
//过滤奇数位置上的数字
println((0..6).map(::factorial).filterIndexed { index, i -> index % 2 == 1 })
可以按照条件运行到条件失效
//取得符合条件的,当不符合条件就停止
println((0..6).map(::factorial).takeWhile { it % 2 == 1 })
更多的需要长期的探索和学习了。
完整代码
package com.cofox.kotlin.mydo.HeighterCodeFunction
/**
* chapter01
* @Author: Jian Junbo
* @Email: junbojian@qq.com
* @Create: 2017/11/26 17:00
* Copyright (c) 2017 Jian Junbo All rights reserved.
*
* Description: flatmap
*/
fun main(args: Array<String>) {
val list = listOf(
1..10,
2..5,
1017..1028
)
val flatlist = list.flatMap { intRange ->
intRange.map { intElement ->
"No.$intElement"
}
}
val flatlistUsually = list.flatMap {
it.map {
"No.$it"
}
}
println(flatlist)
val flatlist2 = list.flatMap { it }
val reducelist = flatlist2.reduce { acc, i -> acc + i }
println(reducelist)
println((1..5).joinToString(","))
//顺序
println((0..6).map(::factorial).fold(StringBuilder()) { acc, i -> acc.append(i).append(",") })
//倒序
println((0..6).map(::factorial).foldRight(StringBuilder()) { i, acc -> acc.append(i).append(",") })
//过滤偶数
println((0..6).map(::factorial).filter { it % 2 == 0 })
//过滤奇数位置上的数字
println((0..6).map(::factorial).filterIndexed { index, i -> index % 2 == 1 })
//取得符合条件的,当不符合条件就停止
println((0..6).map(::factorial).takeWhile { it % 2 == 1 })
}
/**阶乘*/
fun factorial(n: Int): Int {
if (n == 0) return 1
return (1..n).reduce { acc, i -> acc * i }
}
运行结果
[No.1, No.2, No.3, No.4, No.5, No.6, No.7, No.8, No.9, No.10, No.2, No.3, No.4, No.5, No.1017, No.1018, No.1019, No.1020, No.1021, No.1022, No.1023, No.1024, No.1025, No.1026, No.1027, No.1028]
12339
1,2,3,4,5
1,1,2,6,24,120,720,
720,120,24,6,2,1,1,
[2, 6, 24, 120, 720]
[1, 6, 120]
[1, 1]