【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

相关文章

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

Kotlin Map映射转换问题小结

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

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

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

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

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

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

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

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

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

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

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

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

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重