安全调用(?.) 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逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场