Kotlin专题程序员Kotlin编程

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]
上一篇下一篇

猜你喜欢

热点阅读