安全调用(?.) Elvis运算符(?:)

2024-04-16 10:12
文章标签 安全 调用 运算符 elvis

本文主要是介绍安全调用(?.) Elvis运算符(?:),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安全调用(?.)

安全调用运算符允许开发者在可能为空的对象上安全地访问属性或调用方法。如果对象不为空,操作就会被执行;如果对象为空,则跳过操作,并返回null而不是抛出NullPointerException。

val length = text?.length

如果text不为null,那么length将被赋予text的长度;如果text为null,那么length也将为null,全部都不会报NullPointerException。

data class Department(val head: Manager?)
data class Manager(val name: String, val assistant: Assistant?)
data class Assistant(val name: String)fun getAssistantName(department: Department?): String? {// Accesses the name of the assistant of the department head, if all references are non-nullreturn department?.head?.assistant?.name
}

还可以链式地进行安全调用,如上面的例子:只有在助理assistant、经理head和部门department都不为空的情况下,才会返回助理的名字assistant?.name

Elvis运算符(?:)

Kotlin还引入了Elvis运算符(?:),该运算符提供了一种简明方式来处理在安全调用或任何可为空表达式后的null情况,允许开发者指定一个默认值或替代表达式,以便在前面的表达式评估为null时使用。

val nameLength = person?.name?.length ?: 0

在上面的例子中,如果person或person.name为null,那么而不是返回null,而是求值于?:之前的表达式,并将nameLength设为0。

?.  与 ?:  结合使用

有许多情景下可以结合两者,以实现更简短、可读且安全的代码库。

即  如果不为空,返回语句返回实际数值 如果为空返回语句返回一个自定义的默认值(就不要返回null) .  

无论你何时何地使用它们,Kotlin的安全调用运算符(?.)和Elvis运算符(?:)都会简化对null的处理,提高代码的安全性和清晰度。

安全调用运算符通过为null引用返回null来防止NullPointerException,而Elvis运算符在这种情况下提供默认值。两者共同减少了与null相关的错误,并简化了代码,使Kotlin的开发更加高效和直接。

用于对象的非空判断

 如下面的例子:如果助理assistant、经理head和部门department都不为空的情况下,才会返回助理的名字assistant?.name,   如果有一个对象为null,则返回自定义默认值 "No Manager"

fun getManagerName(department: Department?): String {// Returns the department head's name or "No Manager" if nullreturn department?.head?.name ?: "No Manager"
}

  用于集合元素的非空判断

也可以在可能包含null元素的集合中使用,或者当集合本身可能为null时:

如果集合的元素name存在 则返回元素name的长度值name?.length

如果集合的元素name不存在(为null),则返回自定义的默认值"null"

val listOfNames: List<String?> = listOf("Alice", null, "Bob", "Carol")
// Prints the length of each name, skipping nulls
listOfNames.forEach { name ->println(name?.length ?: "null")
}

 用于类型转换非空判断

在类型转换时,可以使用安全类型转换运算符(as?),它可以与安全调用运算符结合来安全地尝试类型转换,然后在转换类型上执行操作。

val obj: Any = "This is a string"
// Safely casts obj to a String and then calls length, else returns null if cast fails
val length = (obj as? String)?.length

这篇关于安全调用(?.) Elvis运算符(?:)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1