【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中常见队列举例详解(非线程安全)

《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 里,运算符重载函数允许为自定义类型重

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数