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......) 的相关文章

  • Kotlin 中是否可以为 mutableStateOf() 提供自定义设置器

    我想在每次设置某个状态后两秒进行一些操作 viewModel 内的代码 var isLoading mutableStateOf LoadingState NONE set value Timber d Custom Setter Not
  • 如何通过单击按钮从反应状态挂钩数组中删除对象

    我正在尝试制作一个按钮 根据传递的索引从数组 即状态 中删除一个对象 我已经尝试了很多 但我的方法都不起作用 所以这是代码 希望我可以找人帮忙 state const items setItems useState name quantit
  • 如何为高流量网络应用程序实现“保存搜索”功能?

    我想知道可以在 eBay 等大型网络应用程序上找到的 保存的搜索 功能 您可以做的就是保存搜索 例如 宾得镜头 50mm 1 4 每当有人出售符合搜索条件的新优质标准快速宾得镜头时 您都会收到通知 对我来说 实现此类功能并不是一件简单的事情
  • Typealias - 在 Kotlin 中组合多个接口

    我对 Kotlin 中的协议组合有点生疏 我只想通过声明自定义来组合多个接口typealias This doesn t work typealias MyType ReadableInterface WritableInterface 有
  • “android.enableUnitTestBinaryResources”已弃用[重复]

    这个问题在这里已经有答案了 我刚刚更新了我的 Android Studio 现在当我构建我的项目时 我收到此错误 选项 android enableUnitTestBinaryResources 已弃用 这 当前默认值为 假 已从当前版本中
  • SQLAlchemy - 将文本查询与过滤器结合起来

    我在用着SA 0 6 6 Python 2 66 and Postgres 8 3 我有某些查询需要一些复杂的安全检查 可以使用WITH RECURSIVE询问 我想做的是将文本查询与查询对象结合起来 这样我就可以根据需要应用过滤器 我最初
  • 将 dataGridView 绑定到绑定列表并按文本框过滤行

    我正在开发一个 Winforms 应用程序 并且有一个已经绑定到 dataGridView 的对象的 BindingList 我还有一个 过滤器 文本框 如果它们与文本框文本不匹配 我想从 datagridview 行中过滤掉行 我想以某种
  • @Service 中带有 Kotlin 的 Spring Boot @Autowired 始终为 null

    目前 我尝试使用 Kotlin 重写我的 Java Spring Boot 应用程序 我遇到了一个问题 在我所有的类中都用 Service依赖注入无法正常工作 所有实例都null 这是一个例子 Service Transactional o
  • Ktor 如何处理空响应

    我使用 Ktor 和这样的线路myentity client get url 从 API 响应获取并反序列化我的实体 当 API 返回某些内容时它工作正常 但是一旦 API 没有任何可返回的内容并发送 HTTP 204 响应 它就会失败并显
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter
  • 使用另一个对象数组过滤对象数组

    这个问题与这个问题类似Jquery 过滤带循环的对象数组 https stackoverflow com questions 30998424 jquery filter array of object with loop但这次我需要使用对
  • Kotlin 协程阻塞 Android 中的主线程

    我是 Kotlin 和协程的新手 我有一个fun在我的活动及其内部 检查User用户名和密码 如果为真 则返回Users object 一切都好 但是当我按下按钮时 我的活动被阻止并等待响应Users login 我用这个有趣的 priva
  • LazyColumn - Items 关键参数的用途?

    有人可以解释一下它的主要目的是什么吗 key LazyListScope 的 items itemsIndexed 函数内的参数 如果我们指定该参数 我们会得到什么或不会得到什么 我不确定我是否理解与此参数相关的官方文档 key 代表该项目
  • Moshi 无法解析 nullable

    你好 希望你能帮助我 使用 kotlin Retrofit2 moshi 我从 https api spacexdata com v3 launches 获取数据并解析它 一切都很顺利 我得到的属性如下 flight number miss
  • 错误:链接引用失败。 -> 排队作业

    我正在使用 Kotlin 学习 Android Material Design 一切都很顺利 直到我尝试使用 android support design widget FloatingActionButton 当我重建项目时 我收到以下错
  • Jetpack 中的波浪框组成

    有没有办法用Canvas制作一个顶部有波浪形的盒子 我想知道这个效果是否可以直接用Canvas来实现 不需要有滚动动画 不太清楚你为什么在谈论Canvas 要裁剪这样的视图 您可以使用自定义Shape并将其应用到您的视图中Modifier
  • 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

    我对 Android 架构组件的使用非常陌生 因此我决定使用 GithubBrowserSample 来构建我的应用程序来实现我的许多用例 但我有一个问题 我不知道使用这种方法在片段之间共享视图模型的正确方法是什么 我想共享视图模型 因为我
  • Jetpack Compose:制作全屏(绝对定位)组件

    我怎样才能在全屏渲染树的深处制作一个可组合的 类似于Dialog可组合作品 例如 当用户单击图像时 它会显示该图像的全屏预览 而无需更改当前路线 我可以用 CSS 来做到这一点position absolute or position fi
  • Jetpack Compose 中复选框中的透明复选标记

    在我的 Compose 应用程序中 我需要创建一个圆形复选框 我已经通过下面的代码实现了这一点 Composable fun CircleCheckBox isChecked Boolean modifier Modifier Modifi
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转

随机推荐

  • 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