Kotlin标准函数(语法糖)let with run also apply快速讲解

目录

1、知识储备——扩展函数

原理

定义扩展函数

调用扩展函数

2、返回值为上下文对象的标准函数

apply

also

3、返回值为Lambda表达式结果

let

run

with

4、一表总结


1、知识储备——扩展函数

原理

Kotlin 在不继承父类或实现接口下,也能扩展一个类的新功能

定义扩展函数

fun 类A.扩展方法(参数):返回值类型 { }

调用扩展函数

val 新对象 =  类A()
val 获取返回值 = 新对象.扩展方法(传参数)

2、返回值为上下文对象的标准函数

apply

  • 对象引用为this(可省略)
  • 返回对象本身
  • 系统自带的扩展函数
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    val result = StringBuilder().apply {
        append("Start eating fruits. \n")
        for (fruit in list) {
            append(fruit).append("\n")
        }
        append("Ate all fruits.")
    }

讲解:这里创建一个集合,StringBuilder对象创建后调用apply函数,StringBuilder相关方法直接调用即可,或this.方法名调用也可;最后这个对象整体返回给result变量

also

  • 对象引用为it(可自定义,但是不可省略)
  • 返回对象本身
  • 系统自带的扩展函数
    val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
    val result = StringBuilder().also {
        append("Start eating fruits. \n")
        for (fruit in list) {
            it.append(fruit).append("\n")
        }
        it.append("Ate all fruits.")
    }
//或者自定义引用
    val result = StringBuilder().also {temp->
        append("Start eating fruits. \n")
        for (fruit in list) {
            temp.append(fruit).append("\n")
        }
        temp.append("Ate all fruits.")
    }


讲解:与apply最大区别就是调用自身方法或属性,需要用it或自定义的名字来调用;最后也是将整体返回给result

3、返回值为Lambda表达式结果

let

  • 引用对象为it
  • 返回let函数最后一行非赋值语句值,否则返回Unit
  • 系统自带的扩展函数
//letResult接收Unit
val letResult:Int? = book.let { bookEntry: Book ->
    bookEntry.changePrice(100)
    bookEntry.name = "letResult"
}

//letResult接收100
val letResult:Int? = book.let { bookEntry: Book ->
    bookEntry.changePrice(100)
    bookEntry.name = "letResult"
    100
}

run

  • 引用对象为this(可省略)
  • 返回run函数最后一行非赋值语句值,否则返回Unit
  • 系统自带的扩展函数
//输出结果:  
    修改完成  
    阿文2

fun main() {
    val data = Data("阿文", 18)
    val reslut = data.run {
        name = "阿文2"
        "修改完成"
    }
    println(reslut)
    println(data.name)
}


with

  • 引用对象为this(可省略)
  • 返回run函数最后一行非赋值语句值,否则返回Unit
  • 非扩展函数
val withResult = with(book) {
    changePrice(300)
    name = "withResult"
    this //也可以把这个对象作为返回值
}
println("withResult $withResult")

讲解:和run用法不同,但是引用对象和返回方式是一模一样的

4、一表总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/799732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硅谷甄选4(项目主体)

1.路由配置 1.1路由组件的雏形 src\views\home\index.vue(以home组件为例) 安装插件: 1.2路由配置 1.2.1路由index文件 src\router\index.ts //通过vue-router插件实现模板路由配置 import { createRouter, createWebHashHistory } fro…

【Qt 常用控件】

文章目录 1. Push Button 1. Push Button 🐧给按钮设置图标

链接追踪系列-09.spring cloud项目整合elk显示业务日志

准备工作: 参看本系列之前篇:服务器安装elastic search 本机docker启动的kibana-tencent 使用本机安装的logstash。。。 本微服务实现的logstash配置如下: 使用腾讯云redis 启动本机mysql 启动本机docker 启动nacos,微服务依赖它作为…

防火墙的双机热备实验和通道策略

需求: 12,对现有网络进行改造升级,将当个防火墙组网改成双机热备的组网形式,做负载分担模式,游客区和DMZ区走FW3,生产区和办公区的流量走FW1 13,办公区上网用户限制流量不超过100M,…

象过河云进销存管理系统,简单、方便、高效!

在当今这个快节奏的商业时代,企业的日常运营管理愈发注重效率和便捷性。基于这样的需求,象过河云进销存管理系统应运而生,它以“简单、方便、高效”为核心价值,为众多企业量身打造了一站式的解决方案。 象过河云进销存管理系统打破…

MDK KEIL程序代码编译成静态库文件及库引用笔记教程

1、为什么要编译成库文件 在商业性的程序代码或软件中,各种静态库、动态库是非常常见的。甚至有许多的开源程序,其开放的源码工程中,也有一些程序代码是并不对外开放的,以一个静态库或动态库和一个头文件及部分说明文件的方式提供…

【Linux系列】TEE 命令:同时输出到终端和文件

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

AmazonS3部署以及nacos配置参数

AmazonS3部署 因为涉及到做的需求的头像的处理,所以需要去找头像的来源,没想到又是我们的老熟人,AmazonS3,巧了已经是第二次用了,上次我是用的别人的工具类去干的,这一次我这边自己编辑具体工具类型。 对应…

谷歌DeepMind被曝抄袭开源成果,论文还中了顶流会议

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践,基于大语言模型和RAG技术,集合海量工业领域生态资源方优质产品和知识服务,旨在通过智能搜索、连续交互,实时生成个性化的内容…

vue3+ECharts实现可视化中国地图

目录 版本问题解决 中国地图实现 版本问题解决 目前echarts的最新版本为5.5.1 echarts在4.9.0版本以后移除了中国地图,所以如果的你的版本高于4.9.0就需要手动导入中国地图。版本低于或者等于4.9.0则不需要导入。 这里我分享一种导入方法: 1.将项目的…

SQL中的谓词与谓词下推

在 SQL 查询中,谓词(Predicate)是用来对数据进行过滤的条件。它们决定了数据从数据库表中被选择的条件。理解和正确使用 SQL 谓词对于编写高效查询至关重要。 目录 什么是谓词?一个真实的故事SQL 谓词的代码示例比较谓词逻辑谓词…

Gitee简易使用流程(后期优化)

目录 1.修改用户名 2.文件管理 新建文件/文件夹流程如下: 上传文件流程如下: 以主页界面为起点 1.修改用户名 点解右上角的头像--> 点击“账号设置” 点击左边栏里的“个人资料“ 直接修改用户名即可 2.文件管理 选择一个有修改权限仓库&#…

【RAGFlow】Ubuntu系统下实现源码启动RAGFlow

一、RAGFlow 是什么? RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用…

隧道调频广播信号覆盖系统改造-泄漏电缆隧道全线无盲区调频覆盖解决方法探究

隧道调频广播信号覆盖系统改造-泄漏电缆隧道全线无盲区调频覆盖解决方法探究 由北京海特伟业科技有限公司任洪卓发布于2024年7月15日 随着城市交通的不断发展,隧道作为城市交通的重要组成部分,承担着日益增长的交通压力。为了确保行驶在隧道中的车辆能够…

AV1 编码标准中帧内预测技术概述

AV1 编码标准帧内预测 AV1(AOMedia Video 1)是一种开源的视频编码格式,旨在提供比现有标准更高的压缩效率和更好的视频质量。在帧内预测方面,AV1相较于其前身VP9和其他编解码标准,如H.264/AVC和H.265/HEVC,…

【分布式系统】CephFS文件系统之MDS接口详解

目录 一.服务端操作 1.在管理节点创建 mds 服务 2.查看各个节点的 mds 服务(可选) 3.创建存储池,启用 ceph 文件系统 4.查看mds状态,一个up,其余两个待命,目前的工作的是node01上的mds服务 5.创建用户…

做印尼TikTok直播会遇到什么困难?

TikTok直播已成为当下社交娱乐的重要组成部分,越来越多的直播达人在这个平台上崭露头角。特别是海外直播,受到了广大网友的热烈追捧。那么,在进行印尼TikTok直播会遇到哪些困难?这些困难是否可以通过TikTok直播专线来解决呢&#…

DBA 数据库管理 表管理 数据批量处理。表头约束

表管理 建库 库名命名规则:仅可以使用数字、字母、下划线、不能纯数字 不可使用MySQL命令或特殊字符 库名区分字母大小写 加if not exists 命令避免重名报错 create database if not exists gamedb; 建表 drop database if exists gamedb ; 删表…

高频面试题基本总结回顾4(含笔试高频算法整理)

目录 一、基本面试流程回顾 二、基本高频算法题展示 三、基本面试题总结回顾 (一)Java高频面试题整理 (二)JVM相关面试问题整理 (三)MySQL相关面试问题整理 (四)Redis相关面试…

【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式

注释: RTCM响应消息1020为GLONASS星历信息,暂不介绍,前公司暂未研发RTCM消息类型版本的DR/RTK模块,DR/RTK模块仅NMEA消息类型使用 注释: 公司使用的多信号语句类型为MSM4&MSM7,也应该是运用最广泛的语句…