时间:2021-05-20
Kotlin简介
Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与Java相比,Kotlin的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与Java高度可互操作,可以同时用在一个项目中。
kotlin 语言特性
kotlin中一切皆为对象
语法特性及规范
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}总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Kotlin基础教程之操作符与操作符重载Kotlin操作符的使用方法与其他语言差不多,最大的特点就在于infixfunctioncall(事实上infixfun
学习目录一、数据类型数据类型二、操作符递增和递减操作符:位操作符:布尔操作符:加性操作符:相等操作符三、语句for-in语句label语句一、数据类型数据类型基
C++基础编程之十进制转换为任意进制及操作符重载最近学习C++的基础知识,完成十进制转换为任意进制及操作符重载,在网上找的不错的资料,这里记录下,实例代码:#i
一元操作符只能操作一个值的操作符叫一元操作符。一元操作符是ECMAScript中最简单的操作符。1.递增和递减操作符递增递减操作符直接借鉴C,而且各有两个版本:
剩余操作符之前这篇文章JavaScript展开操作符(Spreadoperator)介绍讲解过展开操作符。剩余操作符和展开操作符的表示方式一样,都是三个点'…'