【Kotlin】标准库函数 ① ( apply 标准库函数 | let 标准库函数 )

news2024/11/30 12:45:03

文章目录

  • 一、apply 标准库函数
  • 二、let 标准库函数


Kotlin 语言中 , 在 Standard.kt 源码中 , 为所有类型定义了一批标准库函数 , 所有的 Kotlin 类型都可以调用这些函数 ;





一、apply 标准库函数



Kotlin 标准库函数 中的 apply 函数 ,

该函数可以看作 实例对象 的 配置函数 ,

传入 T.() -> Unit 类型 Lambda 表达式 作为参数 ,

该实例对象默认为 Lambda 表达式中的 this 参数 ;


apply 函数 的返回值 是 接收者对象 ,

也就是 调用 apply 函数 的实例对象 ,

同时也是 Lambda 表达式参数中的 this 参数 ;


apply 标准库函数原型 :

/**
 * 以' this '值作为接收者调用指定函数[block],并返回' this '值。
 *
 * 有关详细使用信息,请参阅[scope functions]的文档
 * (https://kotlinlang.org/docs/reference/scope-functions.html#apply)。
 */
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

代码示例 : 创建 File 文件对象 , 并为该文件设置 可读 , 可写 , 可执行 权限 ;

import java.io.File

fun main() {
    val file = File("hello.txt")
    file.setReadable(true)
    file.setWritable(true)
    file.setExecutable(true)
}

apply 函数代码示例 : 后面设置 可读 , 可写 , 可执行 权限的配置操作 , 可以在 apply 标准库函数中完成 , 代码如下 :

import java.io.File

fun main() {
    val file = File("hello.txt").apply {
        this.setReadable(true)
        this.setWritable(true)
        this.setExecutable(true)
    }
}




二、let 标准库函数



Kotlin 标准库函数 中的 let 函数 ,

可以传入 (T) -> R 类型 Lambda 表达式 作为参数 ,

该 匿名函数 中 使用 it 默认变量 获取 调用者 实例对象 ;


apply 函数与 let 函数的区别 :

  • apply 函数的 返回值是 调用者 ;
  • let 函数的 返回值是 Lambda 表达式的最后一行 ;

let 函数原型 :

/**
 * 调用以' this '值作为参数的指定函数[block],并返回其结果。
 *
 * 有关详细使用信息,请参阅[scope functions]的文档
 * (https://kotlinlang.org/docs/reference/scope-functions.html#let)。
 */
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

代码示例 :

fun main() {
    val name = "tom".let {
        it.capitalize()
    }
    println(name)
}

上述代码中 , 调用 字符串 “tom” let 函数 ,

在 let 函数中 , 将首字母变为大写 , 并返回 ,

let 函数返回的是 匿名函数 的最后一行 , 因此将 “Tom” 字符串 返回了 ;

如果将 let 函数换成 apply 函数 , 则返回的就是 “tom” 字符串本身 , 不是 Lambda 表达式的最后一行 ;

执行结果 :

Tom

在这里插入图片描述

let 函数与 空安全操作符 ?. , 空合并操作符 ?: 结合使用 , 可替代 if 语句效果 ;

代码示例 :

fun main() {
    val name: String? = null
    println(getName(name))
}

fun getName(name: String?): String {
    return name?.let {
        "欢迎 $name 同学"
    }?: "name 为空"
}

在上述函数中 , 首先确定 name 变量是否为空 ,

如果 name 为空 , 则 name?.let {...} 为空 , 后面的 let 函数根本不会执行 ,

此时会取 空合并操作符 ?: 后面的值作为整个表达式的值 ;

如果 name 不为空 , 则 执行 let 函数 , 整个表达式的值 就是 let 函数的最后一行 返回值 ;

执行结果 :

name 为空

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

现货黄金术语汇总

有的投资者可能并不是新手&#xff0c;可能之前对股票投资的一些术语有一定的了解甚至说是经验。但是转到现货黄金市场的时候&#xff0c;还是对很多术语感到很陌生&#xff0c;下面小编针对一些与股票不一样的现货黄金术语进行介绍&#xff0c;希望可以帮助投资者们尽快"…

前言技术之swagger

一.前后端分离的特点前后端分离是的前端与后端之间的职责更加明确 后台&#xff1a; 负责业务处理 前端&#xff1a; 负责显示逻辑 在这种情况下&#xff0c;前端和后端可以分别交付给专业的开发人员去做&#xff0c;所以是必须要定义前后端直接的对接 接口&#xff0c;否则各自…

liblas读取点云,设置半透明

一&#xff0c;用Liblas读取点云数据&#xff0c;获取点云位置和颜色 二&#xff0c;将点云位置和颜色分别代入geode的位置数组和颜色数组 三&#xff0c;用glsl设置半透明。需要注意的是 1&#xff0c;颜色数组是用attribute,所以要用 geom->setVertexAttribArray(10, colo…

Wireshark抓包分析DHCP

1、DHCP简介动态主机设置协议&#xff08;英语&#xff1a;Dynamic Host Configuration Protocol&#xff0c;DHCP&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;主要有两个用途&#xff1a;用于内部网或网络服务供应商自动分配IP地址&#xff1b…

从0到1完成一个Vue后台管理项目(十五、作业列表、表格数据方法的封装)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

解决虚拟机安装 VMware Tools 灰色无法点击问题

环境&#xff1a; 主机 OS: Windows 11 虚拟机平台: VMware Workstation 17 Pro 虚拟系统: Ubuntu 22.04 1. 问题 安装好 Linux 系统后&#xff0c;想要适配桌面大小等其它功能就需要安装 VMware Tools 这个工具&#xff0c;最简单的办法就是通过虚拟机平台的 “一键安装”&a…

Java之ATM系统

目录项目介绍系统准备&#xff0c;首页设计总结开户功能总结用户登录总结用户操作页设计、查询账户、退出账户功能用户存钱取款功能转账功能密码修改、销户源代码项目介绍 系统准备&#xff0c;首页设计 总结 1、用户的账户信息&#xff0c;系统如何表示的? 定义账户类Accoun…

【CVHub】现代目标检测故事 | 40+目标检测网络架构大盘点!从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2

本文来源“CVHub”公众号&#xff0c;侵权删&#xff0c;干货满满。 作者丨派派星 来源丨CVHub 原文链接&#xff1a;现代目标检测故事 | 40种网络架构大盘点&#xff01;从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2 导读 目标检测是指在图像或视频中分…

PHY6230 高性价比低功耗高性能 集成32-bit MCU BLE5.2+2.4G芯片

PHY6230 是一款高性价比低功耗高性能Bluetooth LE 5.2系统级芯片&#xff0c;集成32-bit高性能低功耗MCU&#xff0c;16KB OTP&#xff0c;8KB Retention SRAM和64KB ROM&#xff0c;可选EEPROM。内置高性能多模射频收发机最大发射功率10dBm&#xff0c;BLE 1Mbps速率下接收灵敏…

快手发布2022直播生态报告,运营人速览

1、快手电商推出2023年直播间联合补贴活动1月5日&#xff0c;快手电商推出2023年直播间联合补贴活动。该活动主要目的是助力主播完成更高销售额&#xff0c;报名成功后&#xff0c;平台将对直播间内的一部分活跃用户发放10%-16%折扣率的满减优惠券&#xff0c;成本由平台和主播…

【BUG解决方案】jQuery数组中包含数据,但通过 .length 获得的数组长度始终为0

0. BUG展示 var lels []; for (var i 0; i < maxDevNums 1; i) {lels.push([]); } $.ajax({type : "post",async : true,url : "/sc/comb/history/data",data : {},dataType : "json",success : function (result) {if (result) {for (le…

FFmpeg 集成 x265 编译及解码

x265 是一个免费的软件库和应用程序&#xff0c;用于将视频流编码为 H.265/MPEG-H HEVC 压缩格式&#xff0c;并在 GNU GPL 条款下发布。 FFmpeg 为了支持 H.265 编、解码可以集成 x265 编译&#xff0c;在编译 FFmpeg 之前需要先编译 x265&#xff0c;但并不是所有的版本都能…

Python一轮知识拾遗

目录 字符串格式化 %格式符 format字符串格式化 三元条件运算符 可迭代对象 break和continue语句 enumerate函数 序列封包 序列解包 部分序列解包 append.列表和extend.列表的区别 字符串格式化 通过字符串的格式化&#xff0c;可以输出特定格式的字符串。 (1) 格式化…

为什么要申报绿色工厂?

一、什么是绿色工厂&#xff1f; 绿色工厂是指实现了用地集约化、生产洁净化、废物资源化、能源低碳化的工厂。 二、为什么要申报绿色工厂&#xff1f; 1、政策导向&#xff0c;发展趋势 发展绿色工厂是顺应全球绿色发展的大趋势&#xff0c;符合国家政策导向。 2、荣誉称号…

[笔记]Windows Cyswin ssh配置及远程控制

文章目录前言一、配置1.1 安装 Cygwin1.2 Cygwin安装时搜索安装ssh1.3 添加cygwin安装目录至Path环境变量1.4 配置 SSHD 服务1.5 添加 sshd连接账号二、使用2.1 使用配置的连接账号进行登录2.2 连接远程主机三、常见问题3.1 ssh on cygwin和openssh 冲突 提示 Host key verific…

新增血缘关系功能,色彩地图支持标记功能,DataEase开源数据可视化分析平台v1.18.0发布

2023年1月9日&#xff0c;DataEase开源数据可视化分析平台正式发布v1.18.0版本。 这一版本的功能升级包括&#xff1a;数据集方面&#xff0c;定时任务采用分页的方式拉取数据&#xff0c;减少资源消耗&#xff1b;仪表板方面&#xff0c;新增仪表板主题&#xff0c;以满足不同…

二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】

目录 1、什么是二叉搜索树&#xff1f; 2、手动模拟二叉搜索树 2.1、整体代码 2.2、查找数据 2.3、插入数据 2.4、删除数据 3、性能分析 1、什么是二叉搜索树&#xff1f; 二叉搜索树也叫作二叉排序树&#xff0c;可以使一颗空树&#xff0c;也可以是具有以下性质的二…

JavaScript 高级 内存管理和闭包

这里写目录标题1. JavaScript内存管理2. 垃圾回收机制算法1. 引用计数算法2. 标记清除算法3. 闭包的概念理解4. 内存泄露5. 面试题1. JavaScript内存管理 不管什么样的编程语言&#xff0c;在代码的执行过程中都是需要给它分配内存的&#xff0c;不同的是某些编程语言需要我们…

基于融合C3SE+YOLOv5s的高精度二维码检测识别分析系统

在前面的系列博文中&#xff0c;我们尝试了在不同款的yolov5模型中加入不同的注意力机制来提升模型的性能&#xff0c;都有不错的表现效果&#xff0c;本文主要的目的是尝试将注意力机制融合集成进入原生的C3模块中来替换原生的C3模块来对比分析模型的检测性能&#xff0c;首先…

【精华】JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine&#xff08;Java 虚拟机&#xff09;的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言&#xff1a; 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言&#xff1a; 在遵循…