【Kotlin学习之旅】Kotlin的Elvis运算

2023-11-03 23:20

本文主要是介绍【Kotlin学习之旅】Kotlin的Elvis运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Elvis运算是一个小技巧,其实就是if else 的简化写法。

一、示例程序

下面来一个示例对比代码,如下所示:

fun elvisTest() {var b: String? = "oyp"var len1 = if (b != null) b.length else -1//输出3println(len1)b = nullvar len2 = b?.length ?: -1// 输出 -1 println(len2)
}

在这里插入图片描述

len1 使用的是传统的if分支进行判断,当b不为null的时候返回b.length,否则返回-1

二、Elvis运算符

2.1 Elvis介绍

len2 使用的是 ?: 运算符,该运算符就是Elvis

它的含义是,如果 ?: 左边的表达式不为null,则返回左边表达式的值,否则返回?: 右边表达式的值。

由此可见, ?: 其实就是 if分支的简化写法。

2.2 Elvis分析

Elvis 操作符与安全调用符 ?. 配合使用时,一定要考虑到安全调用符前后是否为空,否则就会带来流程控制混乱的问题。对于刚才例子中的表达式:

val v = a?.b ?: c

因为 ?. 的优先级比 ?: 高,
首先计算 a?.b,按照安全调用符的规则,如果 a == null 则结果为 null,执行 c,
但如果 a.b == null,也会执行 c。

也就是说,它的执行逻辑是这样的:

var temp = if(a != null) a.b else null
val v = if(temp != null) temp else c

它等价于:

val v = if(a == null || a.b == null) c else a.b

所以我们上面介绍的例子,可以这样分析

 var len2 = b?.length ?: -1

等价于

 var len2 = if(b == null || b.length == null) -1 else b.length 

2.3 Elvis与return、throw表达式

由于Kotlin中return、throw都属于表达式,因此它们也可以在 ?: 运算符的右边。

与try语句是表达式一样,Kotlin的throw语句也是表达式。但是由于throw表达式的类型比较特殊,是Nothing类型,因此很少将throw语句赋值给其他变量。但是我们可以在Elvis表达式中使用throw表达式。

示例代码:

class User(var name: String? = null, var pass: String? = null)fun main(args: Array<String>) {val user = User()// 在Elivs表达式中使用throw表达式// throw表达式表示程序程序出现异常,不会对变量赋值val th: String = user.name ?: throw NullPointerException("目标对象不能为null")
}

上面代码将user.name赋值给th变量,但是由于user.name是可空类型,因此程序对user.name使用了Elvis表达式进行判断;

  • 当user.name不为null的时候,将其赋值给th

  • 否则,使用throw表达式,throw表达式的类型是Nothing,用于标识程序无法“真正”得到该表达式的值。

因此,如果user.name为null,程序将出现异常,不会对th赋值,故可将th变量声明为String类型。

这篇关于【Kotlin学习之旅】Kotlin的Elvis运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341581

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Kotlin 枚举类使用举例

《Kotlin枚举类使用举例》枚举类(EnumClasses)是Kotlin中用于定义固定集合值的特殊类,它表示一组命名的常量,每个枚举常量都是该类的单例实例,接下来通过本文给大家介绍Kotl... 目录一、编程枚举类核心概念二、基础语法与特性1. 基本定义2. 带参数的枚举3. 实现接口4. 内置属性三、

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示