【Kotlin】空安全 ④ ( 手动空安全管理 | 空合并操作符 ?: | 空合并操作符与 let 函数结合使用 )

news2024/12/24 0:23:41

在这里插入图片描述

文章目录

  • 一、空合并操作符 ?:
  • 二、空合并操作符与 let 函数结合使用





一、空合并操作符 ?:



空合并操作符 ?: 用法 :

表达式 A ?: 表达式 B

如果 表达式 A 的值 不为 null , 则 整个表达式的值 就是 表达式 A 的值 ;

如果 表达式 A 的值 为 null , 则 整个表达式的值 就是 表达式 B 的值 ;


代码示例 : 在下面的代码中 ,

name 变量 被声明为 String? 可空类型的变量 , 为其赋值为 null ,

使用 name ?: "name 变量为空" 代码 , 其效果如下 :

空合并操作符 左侧的 name 表达式如果为 null , 则 取 右边的 表达式 作为该表达式最终的值 ,

如果 左侧的 name 表达式 不为 null , 则 取 该 name 变量作为 该表达式最终的值 ;

因此 , 第一次使用 name ?: "name 变量为空" 代码时 , name 为空 , 整个表达式 name ?: "name 变量为空" 返回的是 "name 变量为空" 值 , 打印出来的就是 name 变量为空 内容 ;

之后 为 name 变量赋值 "Tom" 字符串值 , 现在 name 变量不为空 , 使用 name ?: "name 变量为空" 代码返回的是 name 变量的值 , 因此打印出来的就是 Tom 内容 ;

fun main() {
    var name: String? = null
    println(name ?: "name 变量为空")

    name = "Tom"
    println(name ?: "name 变量为空")
}

执行结果 :

name 变量为空
Tom

在这里插入图片描述





二、空合并操作符与 let 函数结合使用



空合并操作符 ?:let 函数 结合使用 , 可以 替代 if .. else .. 语句 ;


代码示例 :

fun main() {
    var name: String? = null

    name = "tom"
    name = name?.let {
        it.capitalize()
    } ?: "Jerry"

    println(name)
}

执行结果 :

Tom

在这里插入图片描述


如果 name 变量为 null , 则 ?: 表达式中 , 会选择 ?: 后面的表达式作为最终结果 ;

对应代码如下 :

fun main() {
    var name: String? = null

    name = name?.let {
        it.capitalize()
    } ?: "Jerry"

    println(name)
}

执行结果 :

Jerry

在这里插入图片描述

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

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

相关文章

vue-路由的使用方式

1.下载路由 使用npm的下载: # vue2对应版本 npm i vue-router3# vue3对应版本 npm i vue-router42.路由初试化 路由的三种模式: history, 指定路由的模式, 有hash,history,memory三种模式,一般使用第一种和第三种模式 createWebHashHistory hash模式 > http://localhost…

十大字符串函数与内存操作函数

前言:我们知道在C语言的库中有许许多多的库函数,今天我就来介绍一下自己对两大类库函数中一些常用函数的认识和理解,希望对大家有帮助。 说明:下文中会花较大篇幅实现这些库函数的模拟,请大家不要觉得库函数直接用就好…

UNet入门总结

作者:AI浩 来源:投稿 编辑:学姐 Unet已经是非常老的分割模型了,是2015年《U-Net: Convolutional Networks for Biomedical Image Segmentation》提出的模型。 论文连接:https://arxiv.org/abs/1505.04597 在Unet之前…

Android 深入系统完全讲解(4)

4 SystemServer 创建过程 SystemServer 进程非常关键了,我们上层的服务都是在这里以线程的形式存在,比如 AMS,PMS,WindowManagerService,壁纸服务,而关于调试这个服务进程,我们随后就会讲到。 …

虚拟人-面部表情-Audio2Face语音驱动表情

任务: 输入自己的音频,导入maya模型,让maya模型通过音频驱动说话 教程: https://www.bilibili.com/video/BV1rZ4y1R7H4/?p2&spm_id_frompageDriver&vd_sourceef114f70c3fd4d5394f12dbd3d022bbe 一.下载和安装 1.首先…

Java面试常见问题-SE篇

JavaSE面试问题汇总①int和Integer的区别为什么设计封装类型?JDK、JRE、JVM的区别和equals方法的区别hashCode()与equals()之间的关系泛型中extends和super的区别String、StringBuffer、StringBuilder的区别重载和重写的区别接口和抽象类的区别List与Set的区别Array…

2023/1/8总结

今天学了了强连通算法 Tarjan算法 Tarjan算法是一种求解有向图强连通分量的线性时间的算法,他运用到了DFS算法以及DFS的特性和数据结构——栈。 算法介绍:如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected)。如果有向图G…

LeetCode题解 二叉树(十三):701 二叉搜索树的插入操作;450 删除二叉搜索树中的结点

701 二叉搜索树的插入操作 medium 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。 如果要按照题目中所说改变二叉…

渗透测试中的常用编码

渗透测试中的常用编码 页面编码 在网页设置网页编码 在中加入设置特定html标签 这样页面的编码就会变成utf-8 ,如果没有设置编码就会使用默认 的编码,而浏览器默认编码与之不同就会出现乱码。 常用的有三种格式分别是 utf-8、gbk、gbk2312 ascii编码…

_Linux 进程信号-信号处理篇

文章目录前言捕捉信号1. 内核如何实现信号的捕捉2. sigaction代码验证可重入函数volatile(关键字)SIGCHLD信号实验一实验二前言 信号发送 信号处理 已经讲过,本章讲解信号处理最后一部分。 捕捉信号 信号捕捉过程图 经过信号捕捉过程图:我们知道信号…

语音文件分析

语音文件格式的重要参数 语音波形,它的这个文件,主要的格式就是采样率,那么电话或者嵌入式设备,采样率一般是8000Hz,就一秒钟8000个点,如果是PC机麦克风,那是16K,就一秒钟是16000个点,像这个CD是高保真的,音乐唱片的是用这个44.1K。 量化位数,又叫采样精度,…

绿通科技在创业板通过注册:收入依赖美国市场,张志江为实控人

2023年1月6日,证监会发布关于同意广东绿通新能源电动车科技股份有限公司(下称“绿通科技”或“绿通电动车”)、杭州国泰环保科技股份有限公司首次公开发行股票注册的批复。换句话说,证监会同意上述两家公司的创业板IPO注册。 同日…

【手写 Vue2.x 源码】第十一篇 - Vue 的数据渲染流程

一,前言 上篇,主要介绍了数组数据变化的观测情况,涉及以下几个点: 实现了数组数据变化被劫持后,已重写原型方法的具体逻辑;数组各种数据变化时的观测情况分析; 目前为止,数据劫持…

webpack 如何编写 loader

三种本地开发测试 loader 的方法 1. 匹配(test)单个 loader 你可以通过在 rule 对象使用 path.resolve 指定一个本地文件: webpack.config.js const path require(path);module.exports {//...module: {rules: [{test: /\.js$/,use: [{…

Ansible Automation Platform - 在 RHEL 安装 Ansible Automation Platform 2.3 环境

《OpenShift / RHEL / DevSecOps 汇总目录》 文本已在 RHEL 9 AAP 2.3 环境中进行验证。 说明: 本文介绍如何在一个节点上部署一套 all-in-one 的 Ansible Automation Platform 2.3 的运行环境。红帽 Ansible Automation Platform 2.3 需要至少 RHEL 8.4 以上的环…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + Velodyne VLP-16雷达 测试使用

简介:介绍 Velodyne VLP-16 16线激光雷达 在EHub_tx1_tx2_E100载板,TX1核心模块环境(Ubuntu18.04)下测试ROS驱动,打开使用RVIZ 查看点云数据,本文的前提条件是你的TX1里已经安装了ROS版本:Melod…

HashMap、HashTable、ConcurrentHashMap之间的区别及常见面试题

Java集合类有的集合类是存在线程安全的问题,但是由于之前对于集合类的使用都是在单线程的情况下使用的,不没有在多线程环境下使用,所以不涉及线程安全的问题;这篇博客着重讲解一下多线程环境下使用哈希表。HashMapHashMap本身不是…

一些开发时常用的网站或命令

目录关于gitgit下载网址git安装教程Gortoisegit下载地址关于PythonAnyWhere关于Linux压缩与解压命令关于python的相对与绝对路径使用_\_file_\_实现跨平台关于宝塔面板关于浏览器驱动下载本博客首次编辑于2023.01.04 ,后续将持续进行更新 关于git git下载网址 gi…

Linux - 系统文件目录说明

目录/ - 根目录/bin - 用户基础二进制文件目录/boot - 静态启动文件/dev - 设备文件/etc - 配置文件/home - 主目录/lib - 基础共享库/lib64 - 64位基础共享库/lostfound - 可恢复的文件/media - 可移动媒体/mnt - 临时挂载点目录/opt - 自选软件包/proc - 内核 & 进程文件…

【Node】事件循环机制

Node 中的异步 API 定时器:setTimeout、setIntervalI/O 操作:文件读写、数据库操作、网络请求…Node 独有的 API:process.nextTick、setImmediate 事件循环的流程 Node 的事件循环分为 6 个阶段,这 6 个阶段会按顺序反复运行运行…