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

Kotlin新手基础学习之Elvis *** 作符,第1张

概述Kotlin简介Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、 *** 作符重载、字符串模板。它与Java高度可

Kotlin简介

Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、 *** 作符重载、字符串模板。它与Java高度可互 *** 作,可以同时用在一个项目中。

kotlin 语言特性

  kotlin中一切皆为对象

没有像java一般的基本数据类型,数值类型为:Int,float,Double等 函数也是对象,可作为参数和返回值 自然就会有高阶函数和lambda

语法特性及规范

语句结尾不用分号 使用驼峰命名,尽量避免下划线 public函数应当有说明文档 lambda中花括号内前后都应该有空格

Elvis *** 作符的优先级

首先要注意到,Elvis *** 作符的优先级是比较低的,特别是比加减乘除的运算符低,混合运算时一定要记得加上括号。比如:

fun <T> Iterable<T>.contentHashCode(): Int { return fold(1) {  hash,element ->  hash * 31 + (element?.hashCode() ?: 0) }}

这里如果不用括号将 element?.hashCode() ?: 0 括起来,编译器就会认为这句表达式是 (hash * 31 + element?.hashCode()) ?: 0,出现编译错误。

与 ?. 配合使用时的问题

Elvis *** 作符与安全调用符 ?. 配合使用时,一定要考虑到安全调用符前后是否为空,否则就会带来流程控制混乱的问题。对于任何一个下列的表达式:

val v = a?.b ?: c

因为 ?. 的优先级比 ?: 高,首先计算 a?.b,按照安全调用符的规则,如果 a == null 则结果为 null,执行 c,但如果 a.b == null,也会执行 c。也就是说,它的执行逻辑是这样的:

var temp = if(a != null) a.b else nullval v = if(temp != null) temp else c

它等价于:

val v = if(a == null || a.b == null) c else a.b

实际使用时一定要注意 ?. 前后是否都可能为 null。

?: 与流程控制语句的搭配使用

我发了一个 Kotlin 写的前序遍历二叉树的 Gist,地址在这里:PreOrderTraversing.kt,整个项目:DataStructureLearning-Kotlin

非递归遍历二叉树的代码如下:

private fun preOrderLoop( root: Node? = this.root,List: MutableList<Int> = mutablelistof()): List<Int> { val stack = arraydeque<Node>() stack.push(root ?: return List) while (stack.isNotEmpty()) {  val nodeNow = stack.pop()!!  List += nodeNow.value  nodeNow.right?.let { stack.push(it) }  nodeNow.left?.let { stack.push(it) } } return List}

第二句很有意思。arraydeque 不能容纳 null,一旦插入 null 就会抛出 NPE,而我们的函数要求 root 为 null 时返回一个空的 List,所以这里 push() 的参数写成 root ?: return List,这句代码的逻辑如下:

if(root == null) return Liststack.push(root)

此外,Elvis 还可以配合 break 和 continue 来控制循环流程。

改良 Elvis

Elvis *** 作符很方便,但只能连接表达式,我们可以写一个扩展函数来作为加强版的 Elvis *** 作符。

inline infix fun <T : Any> T?.ifNull(block: (T?) -> T): T { if (this == null) {  return block(this) } return this}

使用方式:

val file = java.io.file("C:\Fakefile")val parent = file.parent ifNull { // do something here}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

总结

以上是内存溢出为你收集整理的Kotlin新手基础学习之Elvis *** 作符全部内容,希望文章能够帮你解决Kotlin新手基础学习之Elvis *** 作符所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1143504.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存