源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-09-29 07:03 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Kotlin新手基础学习之Elvis操作符
[b]Kotlin简介[/b] Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与Java高度可互操作,可以同时用在一个项目中。 [b]kotlin 语言特性[/b]   kotlin中一切皆为对象 [list] [*]没有像java一般的基本数据类型,数值类型为:Int, Float, Double等[/*] [*]函数也是对象,可作为参数和返回值[/*] [*]自然就会有高阶函数和lambda [/*] [/list] [b]语法特性及规范[/b] [list] [*]语句结尾不用分号[/*] [*]使用驼峰命名,尽量避免下划线[/*] [*]public函数应当有说明文档[/*] [*]lambda中花括号内前后都应该有空格[/*] [/list] [b]Elvis 操作符的优先级[/b] 首先要注意到,Elvis 操作符的优先级是比较低的,特别是比加减乘除的运算符低,混合运算时一定要记得加上括号。比如:
fun <T> Iterable<T>.contentHashCode(): Int {
 return fold(1) {
  hash, element ->
  hash * 31 + (element?.hashCode() ?: 0)
 }
}
这里如果不用括号将 [code]element?.hashCode() ?: 0 [/code]括起来,编译器就会认为这句表达式是[code] (hash * 31 + element?.hashCode()) ?: 0[/code],出现编译错误。 [b]与 ?. 配合使用时的问题[/b] Elvis 操作符与安全调用符 ?. 配合使用时,一定要考虑到安全调用符前后是否为空,否则就会带来流程控制混乱的问题。对于任何一个下列的表达式:
val v = a?.b ?: c
因为 ?. 的优先级比 ?: 高,首先计算 a?.b,按照安全调用符的规则,如果 a == null 则结果为 null,执行 c,但如果 a.b == null,也会执行 c。也就是说,它的执行逻辑是这样的:
var temp = if(a != null) a.b else null
val v = if(temp != null) temp else c
它等价于:
val v = if(a == null || a.b == null) c else a.b
实际使用时一定要注意 ?. 前后是否都可能为 null。 [b]?: 与流程控制语句的搭配使用[/b] 我发了一个 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,所以这里 [code]push() [/code]的参数写成 [code]root ?: return list[/code],这句代码的逻辑如下:
if(root == null) return list
stack.push(root)
此外,Elvis 还可以配合 break 和 continue 来控制循环流程。 [b]改良 Elvis[/b] 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
}
[b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部