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

 更新时间:2017年12月03日 15:31:10   作者:code_xzh  
Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源,下面这篇文章主要给大家介绍了关于Kotlin新手基础学习之Elvis操作符的相关资料,需要的朋友可以参考下。

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 null
val 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 list
stack.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
}

总结

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

相关文章

  • Android编程之OpenGL绘图技巧总结

    Android编程之OpenGL绘图技巧总结

    这篇文章主要介绍了Android编程之OpenGL绘图技巧,结合实例形式总结分析了Android基于OpenGL绘图的原理与具体步骤,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android获取系统储存以及内存信息的方法(一)

    Android获取系统储存以及内存信息的方法(一)

    这篇文章主要为大家详细介绍了Android获取系统储存以及内存信息的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • RecyclerView的使用之HelloWorld

    RecyclerView的使用之HelloWorld

    RecyclerView是伴随Android 5.0发布的新控件,是一种列表容器,Google意在用新的RecyclerView来取代老旧的ListView和GridView,它的使用灵活性和性能都要优于ListView,通过本文给大家介绍RecyclerView的使用之HelloWorld,需要的朋友参考下
    2016-03-03
  • Android Service中使用Toast无法正常显示问题的解决方法

    Android Service中使用Toast无法正常显示问题的解决方法

    这篇文章主要介绍了Android Service中使用Toast无法正常显示问题的解决方法,分析了Service中Toast无法正常显示的原因与相关的解决方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • Android 应用的安装过程详解

    Android 应用的安装过程详解

    这篇文章主要介绍了Android 应用的安装过程详解的相关资料,对应Android应用的安装,我想大家应该了解下的,需要的朋友可以参考下
    2016-11-11
  • 解析Android截取手机屏幕两种实现方案

    解析Android截取手机屏幕两种实现方案

    这篇文章主要介绍了解析Android截取手机屏幕两种实现方案,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • Android实现毛玻璃效果的对话框

    Android实现毛玻璃效果的对话框

    这篇文章主要为大家详细介绍了Android实现毛玻璃效果的对话框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Flutter 使用Navigator进行局部跳转页面的方法

    Flutter 使用Navigator进行局部跳转页面的方法

    这篇文章主要介绍了Flutter 使用Navigator进行局部跳转页面的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Android Fragment源码分析Add方法

    Android Fragment源码分析Add方法

    Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,而且我们普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段
    2022-08-08
  • Android蓝牙库FastBle的基础入门使用

    Android蓝牙库FastBle的基础入门使用

    这篇文章主要给大家介绍了关于Android蓝牙库FastBle的基础入门使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07

最新评论