36. 常用的高阶函数

作者: 厚土火焱 | 来源:发表于2017-11-27 11:44 被阅读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]
    

    相关文章

      网友评论

        本文标题:36. 常用的高阶函数

        本文链接:https://www.haomeiwen.com/subject/oubrbxtx.html