【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

相关文章

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

SpringBoot接收JSON类型的参数方式

《SpringBoot接收JSON类型的参数方式》:本文主要介绍SpringBoot接收JSON类型的参数方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、jsON二、代码准备三、Apifox操作总结一、JSON在学习前端技术时,我们有讲到过JSON,而在

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ