Kotlin常用的高阶函数(Filter、TakeWhile、Let、Apply、With......)

2023-11-01

一、Filter

package net.println.kotlin.chapter5.builtins

/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //求(0..6)的阶乘
    (0..6).map(::factorial).forEach(::println)
    //阶乘过滤,只要阶乘是奇数的
    //public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    //    return filterTo(ArrayList<T>(), predicate)
    //}
    println((0..6).map(::factorial).filter { it % 2 == 1 })  //[1, 1]
    //要处于奇数位上的阶乘
    println((0..6).map(::factorial).filterIndexed{ index, i ->  index % 2 == 1 })   //[1, 6, 120]
}

/**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}
}

二、TakeWhile

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

    //现在一个程序是,要按照顺序取数,遇到不符合要求的,程序就停止,例如遇到第一个偶数就停止
    println((0..6).map(::factorial).takeWhile { it % 2 == 1 })  //[1, 1]
}

/**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}
}

三、Let的使用

package net.println.kotlin.chapter5.builtins


/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //let的使用
    findPerson() ?.let { persion ->
        persion.work()
    }
    //王栋 is working!!!
}

/**定义一个Person类*/
data class Person(var name:String, var age: Int){
    fun work(){
        println("$name is working!!!")
    }
}

fun findPerson(): Person ?{
    return Person("王栋",23)
}

四、Apply

package net.println.kotlin.chapter5.builtins
/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    /**
     * Calls the specified function [block] with `this` value as its receiver and returns `this` value.
     */
    /*@kotlin.internal.InlineOnly
    public inline fun <T> T.apply(block: T.() -> Unit): T {
        contract {
            callsInPlace(block, InvocationKind.EXACTLY_ONCE)
        }
        block()
        return this
    }*/
    //apply的使用,可以直接调用work()方法,可以使用Persion中的成员变量
    findPerson() ?.apply {
        work()
        print(age)
    }

}

/**定义一个Person类*/
data class Person(var name:String, var age: Int){
    fun work(){
        println("$name is working!!!")
    }
}

fun findPerson(): Person ?{
    return Person("王栋",23)
}

五、With和Apply的区别
With用来传参、Apply用来调用

/**
 * Calls the specified function [block] with the given [receiver] as its receiver and returns its result.
 */
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

/**
 * Calls the specified function [block] with `this` value as its receiver and returns `this` value.
 */
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

六、两种方式读文件内容

package net.println.kotlin.chapter5.builtins

import java.io.BufferedReader
import java.io.FileReader


/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //1.推荐的输出方式
    val br = BufferedReader(FileReader("hello.txt")).readText()
    println(br)
    /*2.同样可以输出
    with(br){
        var line: String?
        while (true){
            line = readLine() ?: break
            println(line)
        }
        close()
    }*/

    //hello 王栋
}

七、Use
看看Use的源码

/**
 * Executes the given [block] function on this resource and then closes it down correctly whether an exception
 * is thrown or not.
 *
 * @param block a function to process this [Closeable] resource.
 * @return the result of [block] function invoked on this resource.
 */
@InlineOnly
@RequireKotlin("1.2", versionKind = RequireKotlinVersionKind.COMPILER_VERSION, message = "Requires newer compiler version to be inlined correctly.")
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
    var exception: Throwable? = null
    try {
        return block(this)
    } catch (e: Throwable) {
        exception = e
        throw e
    } finally {
        when {
            apiVersionIsAtLeast(1, 1, 0) -> this.closeFinally(exception)
            this == null -> {}
            exception == null -> close()
            else ->
                try {
                    close()
                } catch (closeException: Throwable) {
                    // cause.addSuppressed(closeException) // ignored here
                }
        }
    }
}

八、Use的小例子

package net.println.kotlin.chapter5.builtins

import java.io.BufferedReader
import java.io.FileReader


/**
 * @author:wangdong
 * @description:Kotlin常见的高阶函数
 */

fun main(args: Array<String>) {

    //1.推荐的输出方式
    val br = BufferedReader(FileReader("hello.txt")).use {
        var line: String?
        while (true) {
            line = it.readLine() ?: break
            println(line)
        }
    }
    //hello 王栋
}

好了,结束了!

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

Kotlin常用的高阶函数(Filter、TakeWhile、Let、Apply、With......) 的相关文章

随机推荐

  • stm32ftp服务器实现文件传输,stm32 ftp服务器

    stm32 ftp服务器 内容精选 换一换 客户端压力机硬件要求如表1所示 负载均衡节点 LVS 硬件要求如表2所示 缓存节点 Nginx ATS 硬件要求如表3所示 源站节点 Nginx 硬件要求如表4所示 操作系统要求如表5所示 软件要
  • MSN下载2010最新版

    转载的 哈哈 我的笔记 MSN 最新微软官网下载地址 NLP伪原创技术早期并不是很受欢迎 基于主动学习的伪原创句法识别研究 这几年专注于Web开发 Web界面设计的心得在这篇文章中已经与大家分享 做项目时 如何做比较美观大方的数据输入窗体
  • apisix高性能网关-中文开发文档

    2020年6月12日13 48 33 github https github com apache incubator apisix 目前此项目已有成为apache孵化项目 官方中文文档 https github com apache in
  • 拓展人脉,把握机会,摆脱“孔乙己的长衫”

    孔乙己的长衫 学历究竟成为敲门砖还是枷锁 孔乙已是鲁迅笔下人物 穷困流倒还穿着象征读书人的长衫 迁腐 麻木 最近 大家自我调佩是 当代孔乙己 学历成为思想负担 找工作时高不成低不就 我将从以下几个方面来说一说我对这方面的看法 我认为 在当今
  • 1. 两数之和

    目录 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按
  • 数据结构--计算表达式完整版(涉及乘方)

    思路 两个栈 数据栈与符号栈 在描述优先级时 我们将加减描述为 I级 乘除为 II既 乘方为 III级 1 在之前的只有加减乘除的计算表达式里 就有了初步思路 当我们要计算的时候 局部计算函数 数字栈与符号栈 分别在数字栈顶取出两个操作数
  • i2c_SLAVE

    driver driver通过I2C的接口与DUT相连 负责接收DUT通过接口传来的地址数据等读写信息并作出反应 将sequencer中传来的trans中的数据驱动到总线上并根据设置的ack和nack作出回应 将总线上写来的数据存到tran
  • Visual Studio 2019 C语言程序(VS2019 C语言)

    新的Visual Studio 2019出来已经有一段时间了 博主也是一开始就从vs2017换到了vs2019 发现整体的操作流程还是有一定的改变 因为之前发表过一个vs2017的博客 对Visual Studio IDE和风格确实非常喜欢
  • Qt5 通过 QFtp 实现 Ftp文件下载

    在Qt5环境下使用自编译的QFtp库 参考官方提供的实例 对部分内容进行更改 实现了Ftp下载文件的客户端 详细代码如下 h头文件 ifndef FTPWINDOW H define FTPWINDOW H include
  • linux下查看某服务端口对应的进程ID

    Linux下查看某端口号所对应的进程ID 使用lsof命令 格式为 lsof i 端口号 例如 lsof i 30000 root Web Service CAServer lsof i 30000 COMMAND PID USER FD
  • oracle的io优化--db_writer_processes & dbwr_io_slaves对比

    author skate time 2011 09 29 db writer processes 和 dbwr io slaves对比 在计算机世界里 磁盘的发展速度远低于cpu memory 磁盘io现在已经成为计算机的瓶颈 对于orac
  • 揭密微信跳一跳小游戏那些外挂

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 Hahn 腾讯高级UI工程师 由 WeTest质量开放平台团队 发布于云 社区 WeTest 导读 张小龙 这个游戏发布以后 其实它的效果有点超出我们的预期 我们自己开玩笑说 这个
  • mysql数据表查询操作

    数据表查询操作 准备工作 导入之前需要先创建一个数据库 数据库资料传送门 使用新创建的数据库 使用 source 文件地址 导入数据 create database db charset utf8 use db source home py
  • win10网上邻居看不到别的共享电脑怎么样办

    https jingyan baidu com article 4853e1e5b714aa1909f72600 html 转载于 https www cnblogs com kuangke p 10901469 html
  • 【Dom获取&属性操作】JavaScript 全栈体系(十)

    Web APIs 第四章 操作元素属性 一 操作元素常用属性 还可以通过 JS 设置 修改标签元素属性 比如通过 src更换 图片 最常见的属性比如 href title src 等 语法 对象 属性 值
  • python+appium自动化测试-pytest+allure测试报告(一)

    来自APP Android端自动化测试初学者的笔记 写的不对的地方大家多多指教哦 一 Allure安装 1 pytest和allure插件安装 pip install allure pytest pip install pytest 2 A
  • python3+robotframework+selenium3 浏览器兼容性测试

    robot framework 测试浏览器兼容性 目前ride已支持一下浏览器 firefox ie chrome safari 本次我们已win 10中的ie为例 来看看如何使用python3 robotframework seleniu
  • 我是如何从通信转到Java软件开发工程师的?

    我的CSDN和公众号的读者里面有绝大部分都是在校学生 有本科的 也有专科的 我在微信里收到很多读者的提问 大部分问题都跟如何学习编程有关 有换专业自学的 有迷茫不知道如何学习的 有报培训班没啥效果的等等 我能感受到他们的诚意和焦虑 所以我觉
  • 哪些情况可以终止线程呢

    目录 哪些情况可以终止线程的进行 题目解析 线程结束的三个原因 线程结束的三种方法 具体分析 1 使用标志位推出线程 2 使用stop方法强制终止线程 3 使用interrupt终止线程 哪些情况可以终止线程的进行 题目解析 答案选C A
  • Kotlin常用的高阶函数(Filter、TakeWhile、Let、Apply、With......)

    一 Filter package net println kotlin chapter5 builtins author wangdong description Kotlin常见的高阶函数 fun main args Array