【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

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚: