【Kotlin -- 知识点】可空类型、空安全、Elvis操作符

2023-11-03 23:20

本文主要是介绍【Kotlin -- 知识点】可空类型、空安全、Elvis操作符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、可空类型、空安全

1. 定义一个可空类型的变量

定义一个可空类型的变量的格式为:修饰符 变量名 : 类型? = 值

例子:

// 定义一个不可为空的变量,用var修饰的变量可以被重新赋值,用val修饰的变量则不能,但是不能赋值为null
var a : Int = 12
val b : Int = 13a = 20
// a = null 不能赋值为null   
// b = 20   不能被重新赋值if(a == null){// 这样的判断毫无意义,因为变量a永远不可能null
}/*定义可空类型的变量,即变量可以被赋值为null定义格式为:修饰符 变量名 : 类型? = 值
*/var nullA : Int? = 12
val nullB : Int? = 13nullA = nullif(nullA == null){println("nullA = $nullA")
}

可以看出:变量 nullA 的值为 null

分析:要定义一个可空类型的变量时,即在定义变量的类型后面加上?符号就行了。在使用的时候,记住要判断该段该变量是否为空,这个操作在Java中经常会用到,如果定义一个不可为空类型的变量时,则判断将毫无意义,因为这个变量永远不会为空。

2. if…else…判断

var str : String? = "123456"
str = nullif (str == null){println("变量str为空")
}else{println("str.length => ${str.length}")
}

输出结果:

变量str为空

3. 使用符号?.判断

  • 该符号的用法为:可空类型变量 ?. 属性/方法。如果可空类型变量为 null 时,返回 null
  • 这种用法大量用于链式操作的用法中,能有效避免空引用异常(NullPointException),因为只要链式其中的一个为null,则整个表达式都为 null

例子:

var str : String? = "123456"
str = nullprintln(str?.length)   // 当变量str为null时,会返回空(null)

输出结果为:

null

4. 链式调用

?. 这种符号去判断是否为 null,在 Kotlin 中使用的地方是很多,特别是对于链式调用来说体验性更好。

例子:

class Test{class Builder{        private var name : String? = "Tom"        private var age : Int? = 0        private var sex : String? = "男"fun setName(name : String) : Builder?{this.name = namereturn this}fun setAge(age : Int) : Builder?{this.age = agereturn this}fun setSex(sex: String?) : Builder?{this.sex = sexreturn this}override fun toString(): String {return "Builder(name=$name, age=$age, sex=$sex)"}}
}

输出结果为:

Builder(name=Lily, age=10, sex=女)

5. 函数中使用可空类型的情况下

当一个函数/方法有返回值时,如果方法中的代码使用 ?. 去返回一个值,那么方法的返回值的类型后面也要加上 ? 符号

例子:

fun funNullMethod() : Int? {val str : String? = "123456"return str?.length
}

输出结果:

6

6. let 操作符

  • let操作符的作用:当时用符号?.验证的时候忽略掉null
  • let的用法:变量?.let{ … }

例子:

val arrTest : Array<Int?> = arrayOf(1,2,null,3,null,5,6,null)// 传统写法
for (value in arrTest) {if (value == null){continue}println("value => $value")
}// let写法
for (value in arrTest) {value?.let { println("value => $it") }
}

输出结果:

value => 1
value => 2
value => 3
value => 5
value => 6

注意:上面的两种写法的效果是相同的,可以看出使用 let{} 高阶函数减少了好几行代码

二、Elvis操作符

  1. ?: 这个操作符表示在判断一个可空类型时,会返回一个我们自己设定好的默认值.
  2. !! 这个操作符表示在判断一个可空类型时,会显示的抛出空引用异常(NullPointException).
  3. as? 这个操作符表示为安全的类型转换.

1. ?:操作符

当我们定义了一个可空类型的变量时,如果该变量不为空,则使用,反之使用另外一个不为空的值
例子:

val testStr : String? = nullvar length = 0// 例: 当testStr不为空时,输出其长度,反之输出-1// 传统写法
length = if (testStr != null) testStr.length else -1// ?: 写法
length = testStr?.length ?: -1println(length)

输出结果:

-1

分析:此操作符一般和 ?. 操作符连用。当且仅当?:左边的表达式为 null 时,才会执行 ?: 右边的表达式。

2. !!操作符

!! 操作符可谓是给爱好空引用异常(NullPointException)的开发者使用,因为在使用一个可空类型变量时,在该变量后面加上 !! 操作符,会显示的抛出 NullPointException异常

val testStr : String? = null
println(testStr!!.length)

输出结果:
在这里插入图片描述
可以看出,在未做空判断的情况下直接使用操作符!!的情况下,抛出了空异常

3. as? 操作符

其实这里是指 as 操作符,表示类型转换,如果不能正常转换的情况下使用 as? 操作符。当使用as操作符的使用不能正常的转换的情况下会抛出类型转换(ClassCastException)异常,而使用 as? 操作符则会返回 null,但是不会抛出异常

  • 使用 as
// 会抛出ClassCastException异常
val num1 : Int? = "Koltin" as Int
println("nun1 = $num1")

输出结果:
在这里插入图片描述

  • 使用 as?
val num2 : Int? = "Koltin" as? Int
println("nun2 = $num2)

输出结果:

num2 = null

这篇关于【Kotlin -- 知识点】可空类型、空安全、Elvis操作符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

input的accept属性让文件上传安全高效

《input的accept属性让文件上传安全高效》文章介绍了HTML的input文件上传`accept`属性在文件上传校验中的重要性和优势,通过使用`accept`属性,可以减少前端JavaScrip... 目录前言那个悄悄毁掉你上传体验的“常见写法”改变一切的 html 小特性:accept真正的魔法:让

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

python中的鸭子类型详解

《python中的鸭子类型详解》鸭子类型是Python动态类型系统的灵魂,它通过强调“行为”而非“类型”,赋予了代码极大的灵活性和表现力,本文给大家详细介绍python中的鸭子类型,感兴趣的朋友一起看... 目录1. 核心思想:什么是鸭子类型?2. 与“传统”静态类型语言的对比3. python 中无处不在

Java枚举类型深度详解

《Java枚举类型深度详解》Java的枚举类型(enum)是一种强大的工具,它不仅可以让你的代码更简洁、可读,而且通过类型安全、常量集合、方法重写和接口实现等特性,使得枚举在很多场景下都非常有用,本文... 目录前言1. enum关键字的使用:定义枚举类型什么是枚举类型?如何定义枚举类型?使用枚举类型:2.

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Kotlin 协程之Channel的概念和基本使用详解

《Kotlin协程之Channel的概念和基本使用详解》文章介绍协程在复杂场景中使用Channel进行数据传递与控制,涵盖创建参数、缓冲策略、操作方式及异常处理,适用于持续数据流、多协程协作等,需注... 目录前言launch / async 适合的场景Channel 的概念和基本使用概念Channel 的

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py