首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Elvis运算符与非空断言:这些语句之间的差异?

Elvis运算符与非空断言是两种在编程中常用的语法特性,用于处理变量为空的情况。它们的差异如下:

  1. Elvis运算符(?:):Elvis运算符是一种简化的条件表达式,用于在变量为空时提供一个默认值。它的语法形式为variable ?: defaultValue,表示如果变量variable为空,则返回defaultValue,否则返回variable的值。Elvis运算符适用于任何编程语言中,常用于简化条件判断和赋值操作。
  2. 非空断言(!):非空断言是一种用于明确告知编译器某个变量不会为空的语法特性。它的语法形式为variable!,表示对变量variable进行非空断言,告知编译器该变量不会为空。非空断言适用于一些编程语言中,如Kotlin、Swift等。使用非空断言需要谨慎,因为如果变量实际上为空,会导致空指针异常。

总结:

  • Elvis运算符用于提供默认值,适用于任何编程语言。
  • 非空断言用于明确告知编译器某个变量不会为空,适用于一些编程语言。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

第3章 Kotlin 可类型类型系统第3章 Kotlin 可类型类型系统

通常,编程语言中类型系统中定义了 如何将数值和表达式归为不同类型 如何操作这些类型 这些类型之间如何互相作用 我们在编程语言中使用类型目的是为了让编译器能够确定类型所关联对象需要分配多少空间。...类型系统在各种语言之间有非常大不同,主要差异存在于编译时期语法,以及运行时期操作实现方式。在每一个编程语言中,都有一个特定类型系统。静态类型在编译时期时,就能可靠地发现类型错误。...Kotlin系统类型分为可类型和不可类型。Kotlin中引入了可类型,把有可能为null值单独用可类型来表示。这样就在可引用不可引用之间划分出来一条明确显式“界线”。...3.3.3 断言 !! 如果我们想只有在确保 nullableStr 不是null情况下才能这么调用,否则抛出异常,我们可以使用断言操作符( !!...它唯一允许值是null,被用作任何可类型引用。 3.4.3 AnyAny?类型 就像Any是在类型层次结构根,Any?是可类型层次根。 Any?是Any超集,Any?

2.1K20

Groovy 快速入门

不过Groovy布尔语义更丰富。未到结尾迭代器、对象引用、零数字都认为是真;空集合、空字符串等认为是假。...Groovy关系运算符(大于、小于等于这些)和Java类似。 Groovy逻辑运算符这些)和Java类似,也支持短路计算。 Groovy运算符合Java类似。...Groovy三元运算符条件?值1:值2和Java类似。 可空运算符 Groovy支持Elvis操作符,当对象时候结果是值1,为时结果是值2。...或者更直接,对象是使用对象本身,为时给另一个值,常用于给定某个可变量默认值。 displayName = user.name ?...断言语句 前面我们看到了很多Groovy断言例子。Groovy断言语句功能很强大,以至于文档中写是强力断言(Power assertion)。 Groovy断言形式如下。

1.3K10

如何在Java和Swift中避免引用异常?

检查是否为代码行数为完成任务而编写代码数量相当。...: "" //返回空字符串 注意安全调用之间区别吗?和断言运算符!!正如名称所示,如果反引用变量为null,则前者将立即返回null,而后者将抛出NullPointerException。...: "" Swift Swift运行Kotlin非常相似。类型必须显式地标记才能存储nil值。这可以通过添加?后缀运算符用于字段或变量声明类型。...这个常量可以有可选项相同名称,这将导致在块中不可见实际可选性。除了多个展开语句外,还可以向if let语句添加布尔表达式。这些语句之间用逗号(,)分隔,它行为类似于&&操作符。...它行为 Kotlin’s Elvis操作员相似(?:) let userId = "1234" print(findZipCodeFor(userId: userId) ??

2.7K30

Kotlin之Elvis 操作符

Elvis 操作符优先级 首先要注意到,Elvis 操作符优先级是比较低,特别是比加减乘除运算符低,混合运算时一定要记得加上括号。... ?. 配合使用时问题 Elvis 操作符安全调用符 ?. 配合使用时,一定要考虑到安全调用符前后是否为,否则就会带来流程控制混乱问题。对于任何一个下列表达式: val v = a?....: 流程控制语句搭配使用 我发了一个 Kotlin 写前序遍历二叉树 Gist,地址在这里:PreOrderTraversing.kt,整个项目:DataStructureLearning-Kotlin...递归遍历二叉树代码如下: private fun preOrderLoop( root: Node?...ArrayDeque 不能容纳 null,一旦插入 null 就会抛出 NPE,而我们函数要求 root 为 null 时返回一个 List,所以这里 push() 参数写成 root ?

54350

不要用Java语法思维来写Kotlin

操作符: 这是为指针爱好者准备断言运算符(!!)将任何值转换为类型,若该值为则抛出异常。我们可以写 a!!...,这会返回一个 a 值 (例如:在我们例子中 String)或者如果 a 为,就会抛出一个 指针 异常: val b = a!!.length 所以,我们能不用 !!操作符就不要用。。。...: 左侧表达式elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 注意:当且仅当左侧为时,才会对右侧表达式求值。...如果要只对值执行某个操作,安全调用操作符可以 let 一起使用: val listWithNulls: List<String?...在这些类中,一些标准函数往往是操作一下ide生成

3K40

Kotlin之Elvis 操作符

Elvis 操作符优先级 首先要注意到,Elvis 操作符优先级是比较低,特别是比加减乘除运算符低,混合运算时一定要记得加上括号。... ?. 配合使用时问题 Elvis 操作符安全调用符 ?. 配合使用时,一定要考虑到安全调用符前后是否为,否则就会带来流程控制混乱问题。对于任何一个下列表达式: val v = a?....: 流程控制语句搭配使用 我发了一个 Kotlin 写前序遍历二叉树 Gist,地址在这里:PreOrderTraversing.kt,整个项目:DataStructureLearning-Kotlin...递归遍历二叉树代码如下: private fun preOrderLoop( root: Node?...ArrayDeque 不能容纳 null,一旦插入 null 就会抛出 NPE,而我们函数要求 root 为 null 时返回一个 List,所以这里 push() 参数写成 root ?

1.3K100

Kotlin新手基础学习之Elvis操作符

语法特性及规范 语句结尾不用分号 使用驼峰命名,尽量避免下划线 public函数应当有说明文档 lambda中花括号内前后都应该有空格 Elvis 操作符优先级 首先要注意到,Elvis 操作符优先级是比较低...,特别是比加减乘除运算符低,混合运算时一定要记得加上括号。... ?. 配合使用时问题 Elvis 操作符安全调用符 ?. 配合使用时,一定要考虑到安全调用符前后是否为,否则就会带来流程控制混乱问题。对于任何一个下列表达式: val v = a?....: 流程控制语句搭配使用 我发了一个 Kotlin 写前序遍历二叉树 Gist,地址在这里:PreOrderTraversing.kt,整个项目:DataStructureLearning-Kotlin...递归遍历二叉树代码如下: private fun preOrderLoop( root: Node?

38420

写了多年Java,直到看到Kotlin,原来代码可以如此优雅!

操作符: 这是为指针爱好者准备断言运算符(!!)将任何值转换为类型,若该值为则抛出异常。我们可以写 a!!...,这会返回一个 a 值 (例如:在我们例子中 String)或者如果 a 为,就会抛出一个 指针 异常: val b = a!!.length 所以,我们能不用 !!...: 左侧表达式elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 注意:当且仅当左侧为时,才会对右侧表达式求值。...如果要只对值执行某个操作,安全调用操作符可以 let 一起使用: val listWithNulls: List<String?...在这些类中,一些标准函数往往是操作一下ide生成

3.3K40

Effective Java tips

,并且不会创建其他 Elvis 实例(前面提到警告相同) 使用私有构造器执行实例化。...偶尔你会想写一个只包含静态方法和静态字段类。这些名声非常不好,因为有些人滥用这些类从而避免以面向对象方式思考从而编写过程化程序,但是它们确实有着特殊用途。...换句话说,使用尽可能低访问级别,你正在编写软件对应功能保持一致。...比较 compareTo 方法实现中字段值时,请避免使用「」运算符。相反,使用包装类中静态 compare 方法或 Comparator 接口中构建方法。...继承是强大,但它是有问题,因为它违反封装。只有在子类和父类之间存在真正子类型关系时才适用。即使如此,如果子类父类不在同一个包中,并且父类不是为继承而设计,继承可能会导致脆弱性。

27620

谈谈Kotlin:Kotlin每一行代码都有返回值

:+let 实现 if-else? 这周在网上冲浪时候,看到了这么一个讨论:“Elvis运算符return组合语句,在return前增加逻辑,如何写得优雅?”...:运算符实现if-else」示例: account?.let { it.hello() it.name = "Hello" } ?...: run { println("[nullVal] null code block") } // 例2:可变量为 val notnull: Any?...在文章一开始那个例子里,由于it.name = "Hello"返回值是Unit,是一个值,因此能够如预期,呈现出和if-else等价效果,但这里实际上会留下一个隐藏坑。...= null)写法其实是最可爱。 Tips 介绍一个小技巧: IDEA编辑器提供了快速判模板,在变量后输入.nn回车。 就能收获如下代码。

88360

《Kotlin极简教程》第3章 Kotlin语言基础第3章 Kotlin语言基础《Kotlin极简教程》正式上架:参考资料

另外,目录结构无需匹配:源代码可以在文件系统任意位置。 我们怎么使用这些类和函数呢?我们写一个Junit 测试类来示例说明。...Elvis操作符 ?: 是一个二元运算符,如果第一个操作数为真,则返回第一个操作数,否则将计算并返回其第二个操作数。它是三元条件运算符变体。命名灵感来自猫王发型风格。...Kotlin中没有这样三元运算符 true?1:0,取而代之是if(true) 1 else 0。而Elvis操作符算是精简版三元运算符。...和 断言调用 !!. >>> na?.length null >>> na!!....如果要只对值执行某个操作,安全调用操作符可以 let (以调用者值作为参数来执行指定函数块,并返回其结果)一起使用: >>> val listWithNulls: List<String?

1.6K20

【翻译】Kotlin致简代码之路

其次,我们可以将一个类型标记为可类型( 可以取值 null )或者类型(不能为 null )。一个可类型相对于它所对应类型提供了不同方法,这都是编译器能检测到。...这显著地减少了错误发生从而提高了安全性能。 那么我们该怎么做呢?有几个选择。选择 1 是使用断言申明符 !! 。 val city = order!!.customer!!.address!!....// 需要辅助方法: fun String.emptyToNull() = if (this.isEmpty()) null else this 痴迷于单表达式以及智能转换(避免断言)会导致写出极其难读代码...特别是刚开始学习 Kotlin 时候,很容易迷失在复杂安全引用、 elvis 操作符以及表达式之中。在这种情况下,最好是想想那套陈旧且好用“如果是指针或空白”陈述语句: // 拥抱它!...} 是的,这里仅有一个 null 断言申明符 !! ,因为编译器在 isNullorEmpty() 中不能侦测到 null 检查。但是这段代码非常具有可读性且简洁明了。

1.4K30

Kotlin语法基础之运算符

这些运算符之中,主要包括有:算数运算符、区间运算符、逻辑运算符、关系运算符、赋值运算符、自增自减运算符等。 根据操作数数量来划分,运算符又可以分为一目运算符、双目运算符。...关系运算符优先级低于算术运算符。 2. 关系运算符优先级高于赋值运算符。 区间运算符(a..b) 区间运算符,顾名思义就是可以用来表示两个操作数之间范围集合。...Kotlin语言和Java一样,支持三个标准逻辑运算符,逻辑、逻辑或、逻辑。 && : 逻辑,可以理解为并且意思. || : 逻辑或,可以理解为或者意思,也就是条件可以二取一 !...如果要只对值执行某个操作,安全调用操作符可以 let 一起使用: val listWithNulls: List<String?...Int 可类型集合 如果你有一个可类型元素集合,并且想要过滤元素,你可以使用 filterNotNull 方法来实现。 val nullableList: List<Int?

2.9K50

深入理解Dart安全

下面将从静态分析角度讲一讲Dart如何对空安全特性进行支持、新旧版本之间编码差异、如何迁移旧项目至安全以及整个迁移原理做详细说明。...b 类型是定义时候不符合,此时就会提示编译错误。...是 是 3.1.2 断言 ! 如果确定某个可为表达式为,则可以使用断言操作符 !将其视为。该符号执行运行时检查,表示当前值一定不为,但操作不当容易报运行时错误。...例如在开发过程中,我们可能对某些可变量进行了判断后,编译器依然无法智能判断其,从而无法使用类型方法和属性。 ? 而此时我们确定了此处逻辑中变量是非,就可以使用断言 !...,明确告诉编译器这是一个不为变量,使其通过静态检查。 ? 注:要注意使用了断言必须保证变量不为null,否则会在运行时抛出异常。

4.4K51

第2章 Kotlin 语法基础第2章 Kotlin 语法基础

第2章 Kotlin 语法基础 人与人之间通过语言来交流沟通,互相协作。人计算机之间怎样“交流沟通”呢?答案是编程语言。...2.2 关键字修饰符 通常情况下,编程语言中都有一些具有特殊意义标识符是不能用作变量名这些具备特殊意义标识符叫做关键字(又称保留字),编译器需要针对这些关键字进行词法分析,这是编译器对源码进行编译基础步骤之一...2.4 操作符重载 Kotlin 允许我们为自己类型提供预定义一组操作符实现。这些操作符具有固定符号表示(如 + 或 *)和固定优先级。...2.4.3 二元操作符 Kotlin中二元操作符有算术运算符、索引访问操作符、调用操作符、计算并赋值操作符、相等不等操作符、Elvis 操作符、比较操作符、中缀操作符等。下面我们分别作介绍。...Kotlin中没有这样三元运算符 true?1:0,取而代之是if(true) 1 else 0。而Elvis操作符算是精简版三元运算符

2.6K20

Java Puzzlers

原因在于 JUnit 没有机会去看那个 assertEquals(2, number) 断言是正确还是错误。JUnit 只会知道这个方法正常地返回了,所以它会认为这个方法没有出现错误。...解决方案是交换语句顺序,使得在 ELVIS 初始化之前先初始化 LIVING 即可: public class Elvis { private static final Boolean LIVING...直接使用 boolean,因为基本类型有字面常量,不需要等待那个语句执行。...Integer.MIN_VALUE == -Integer.MIN_VALUE % 运算符是取余数运算符而非取模运算符,它也可能得出负数结果 将一个带符号哈希值映射到桶中时,可以采取如下几种方法:...: 操作符在操作两个不同包装类型时会有违反直觉语义 如果一定要在两个包装类型之间进行选择,不要用 ?

31960

Kotlin入门(8)判断处理

: 为指针或者字串长度为0时返回true,空串可空串均可调用。...isNullOrBlank : 为指针或者字串长度为0或者全为空格时返回true,空串可空串均可调用。 isEmpty : 字串长度为0时返回true,只有空串可调用。...注意到上面的方法有区分空串可空串,这是缘于Kotlin引入了安全概念,每个类型对象都分作不可为null和可以为null两种。...但是,该语句意味着返回值仍然可能为,如果不想在界面上展示“null”,还得另外判断length_null是否为;也就是说,这个做法并未实现原代码完全一致功能。...没有完成任务,Kotlin当然不会罢休,所以它又引入了一个运算符“?:”,学名叫做“Elvis 操作符”,叫起来有点拗口,读者可以把它当作是Java三元运算符“变量名=条件语句?

4.3K10

Kotlin 是如何避免指针问题

在谈Kotlin优势时候,大家都会想到指针安全这一点,那么Kotlin又是如何避免这些问题呢?下面从Kotlin一些语法规则上给出介绍。...可类型 默认声明变量是不能为 null ,如果要使变量能为 null, 需要添加 ?操作符。...name 断言 有时候,要将可变量转成, 常见于Java, 我们知道变量是不可能为 null , 可以用断言 !!。例如: val nullableString: String?...length Elvis操作 Java里面, 有个三元操作?:, 实现 if … else … 赋值。...这样代码没错,但就是有点啰嗦。 Kotlin采用了一种不同null处理方式。它对可类型和不可类型作了区分,可类型后面会跟一个问号,比如Bar?,而Bar类型变量则不可为

1.6K70
领券