Kotlin常用的高阶函数(ForEach、Map、Flatmap、Fold、Reduce......)

2023-10-30

一、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}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin常用的高阶函数(ForEach、Map、Flatmap、Fold、Reduce......) 的相关文章

随机推荐

  • 井下设备类毕业论文文献包含哪些?

    本文是为大家整理的井下设备主题相关的10篇毕业论文文献 包括5篇期刊论文和5篇学位论文 为井下设备选题相关人员撰写毕业论文提供参考 1 期刊论文 变频器在井下设备中的应用 期刊 内蒙古煤炭经济 2019 年第 020 期 关键词 变频器 节
  • uni-app 的坑

    最近在开发一个新项目 使用的vue3 之前用的都是vue2 这不用不知道 一用吓一跳 看代码 data return searchText data 存储数据库的数据 methods async getData const db uniCl
  • git 上传任务用户显示错误修改方法

    目 录 0 问题描述 1 原因 2 步骤 3 总结 0 问题描述 使用git时候登陆自己的账号但每次提交任务显示的是其他人的信息 1 原因 git配置信息中用户名及用户邮箱显示是其他人 可以通过git config l进行查看 git co
  • ADW300物联网电表支持MODBUSTCP协议、MQTT协议-安科瑞黄安南

    摘要 随着通信技术的应用越来越广泛 具有通信功能的电子产品越来越多 同时也随着Wi Fi无线覆盖网络区域的形成 如何利用无线网络覆盖广 带宽高 低使用费率的优势组建物联网系统 变成了一个很实际的问题 安科瑞也紧跟趋势推出了满足客户需求的支持
  • git客户端安装并配置GitLab配置ssh key

    一 安装git客户端 打开Git的安装程序 点击Next之后 安装路径我保持默认选项 然后继续下一步 继续下一步 提示你创建开始菜单 我们继续下一步 上图默认的是第二项 但是我改成了第一项 不想在CMD下使用Git命令 继续下一步 继续下一
  • 【华为OD机试真题2023B卷 JAVA&JS】食堂供餐

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 食堂供餐 知识点编程基础循环 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 某公司员工食堂以盒饭方式供餐 为将员工取餐排队时间降低为0 食堂的供餐速度必须要足够快 现在
  • 源码分析之——WMS启动流程

    1 源码分析之 AMS启动流程 2 源码分析之 WMS启动流程 3 源码分析之 SharedPreferences 4 源码分析之 Retrofit 5 源码分析之 OKHttp 6 源码分析之 Android事件分发机制 前言 上一节讲了
  • 解决Vue路由重复点击报错问题

    给一个元素绑定跳转路由的事件时 跳转后当我们重复点击时就会报以下错误 原因 vueRouter版本问题 解决方案1 降低VueRouter的版本 使用旧版本的VueRouter 3 0 xxx 解决方案2 跳转路径后 捕获异常 不做处理 这
  • PC 服务器故障处理方法

    计算机网络在发展的过程中 PC服务器的各项配置也在不断的升级和改善 随着人们对计算机网络流畅性需求的逐步增长 PC服务器的快速故障分析与维护处理也愈发重要 PC服务器常见的软件故障就是在开机时可能会产生的一系列软件冲突 PC服务器的硬件也可
  • 【详细深入分析OpenHarmony编译流程】

    详细深入分析OpenHarmony编译流程 前言 编译入口 源码根目录 编译命令 记录源码根目录位置 开始构建 获取python解释器 hb主程序 build模块初始化 build模块执行 build和set参数解析 参数配置文件读写 配置
  • 七牛云之微信小程序上传图片

    本节课 我讲的是微信小程序结合七牛云上传图片 仅仅讲如何上传图片并得到图片的云链接 首先 先到官网 https developer qiniu com kodo manual 1205 programming model 了解一下大致的业务
  • docker镜像和容器有什么区别?

    我这里拿大家熟知的VMware来举例 VMware安装虚拟机 gt 下载系统镜像 gt 在VMware里安装系统 gt 得到一个系统虚拟机 我们试着叫它实例 docker里也是类似 概念上 docker里的镜像 VMware里的镜像 doc
  • react实现分页-封装组件

    需求 根据后台的数据 判断是否有下一页 如果有下一页 用户上划加载更多调用接口 结合 antd mobile 的 ListView 组件实现 参数解释 dataSource 数据源 数组 currentPage 页数 initialList
  • bash: jps: 未找到命令…

    bash jps 未找到命令 sudo yum install java 1 8 0 openjdk devel x86 64
  • Linux环境基础开发工具的使用:

    创建新用户 新建用户操作 删除用户 Linux器 vim使用 1 vim的基本概念 vim的三种模式 其实有好多模式 目前掌握这3种即可 分别是命令模式 command mode 插入模式 Insert mode 和底行模式 last li
  • 爬虫:栖落的电影网站,利用requests和re模块

    这是栖落的电影网站地址 https xxx xxx 进入网页 显示 爬取目标 电影的名称 观影人数和评分 易知本网站的url url https xxx xxx 本网站会识别出headers中的python请求而拒绝访问 所以需要更改hea
  • SuperSocket教程五:配置文件启动,配置多服务器示例

    为什么要通过配置启动 1 避免硬编码 SuperSocket提供了很多有用的配置选项 可以充分利用SuperSocket提供的工具 那么怎么通过配置启动 我最开始看文档都没搞懂有些地方 然后查了一下不懂的地方 最后解决问题 这篇博客是和上一
  • pwrite写操作——原子操作,不改变当前文件操作符位置,写入位置offset是一个相对于fd起始地址的偏移量

    意外发现 pwrite 函数是一个原子操作 现测试验证如下 1 2 pwrite相当于先调用lseek接着调用write 但又不完全是这样 3 1 pwrite是原子操作 定位和写操作在一个原子操作中完成 期间不可中断 但分开的lseek和
  • 接口自动化测试实战经验分享,测试用例也能自动生成

    作为测试 你可能会对以下场景感到似曾相识 开发改好的 BUG 反复横跳 版本兼容逻辑多 修复一个 BUG 触发了更多 BUG 上线时系统监控毫无异常 过段时间用户投诉某个页面无数据 改动祖传代码时如履薄冰 心智负担极重 为此本文提出一个自动
  • Kotlin常用的高阶函数(ForEach、Map、Flatmap、Fold、Reduce......)

    一 ForEach 类型于Java的传统的写法 package net println kotlin chapter5 builtins author wangdong description Kotlin常见的高阶函数 fun main