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

Kotlin语言中的那些冷门知识点

这些知识点可能你很少用,但在某些特殊场景中却很有用。今天,就让我们一起来盘点一下那些被我们忽略了的冷门知识点。Let's started…

别名

有时候一个变量或表达式太长,你希望用一个更短的名称来表示,这就是别名的用武之地,即:为变量或表达式起别名。这个知识点在Kotlin官方文档中有提到过,但在实际开发中却很少使用。而事实上,在某些特殊场景中,这很有用。如果你注意过Kotlin的源码,可能发现过它的身影。看下面这段代码:

通过上面的声明之后,你就可以通过别名对原始类进行访问了。例如:访问java.lang.Error,可以使用kotlin.Error。在这种场景中,我们可以认为,通过别名,使代码更加Kotlin化。而在日常使用场景中,你可以这样用:

中缀调用

中缀调用是一个很神奇的语法,但在实际开发中却几乎用不到。所谓的中缀调用,指的是你可以不再依赖点语法进行方法调用,而使用“隔空”的方式进行方法调用。看一个例子:

可以看到,中缀操作符在方法调用的时候可以省略掉点操作符。看到这个神奇的语法,你可能会怀疑,这究竟有什么作用?这难道不是哗众取宠吗?

事实上,在某些场景中,这的确很有用!举个例子,如果你正在使用关系型数据库查询数据,看一个最常见的查询语句:。

从语言层面来说,SQL是一种特殊的编程语言,它比目前的主流面向对象编程语言更高级。而且,它并不使用点语法进行方法调用。这带来的一个最直接的问题就是:当使用面向对象编程语言进行数据库查询的时候,不得不手动将查询到的数据映射到对象中。这是一个非常繁琐的工作,因此才有了一些流行的ORM框架。

想象一下,如果将SQL语句通过中缀操作符映射到方法调用,会怎么样?这是一件很神奇的事情,你会发现,你居然可以在面向对象编程语言中直接使用SQL语句进行数据查询了。并且,你将直接得到你想要的对象,感觉就像在直接操作一个面向对象的数据库。

事实上,做到这一点并不难,我已经做到了。如果你对这个实现感兴趣,请扫描文章下方二维码,关注欧阳锋工作室,查找文章《[Kotlin]操作符重载及中缀调用》即可得到答案。

操作符重载

操作符重载在C++语言中被认为是一个很糟糕的特性!其语法并不难,而难的地方在于,它的使用场景到底在哪里。另外,操作符重载是否会破坏代码的可阅读性。关于这一点,欢迎你在文章下方告诉我你的想法。

可变参数展开操作符

这个知识点在Kotlin官方文档中也有提到过,但仅仅是一笔带过,恐怕很少有人会关注到。在可变参数传值过程中,存在着这样一个问题,看下面这个例子:

可变参数本质上就是一个数组,可当你传入数组的时候,编译器并不会帮你自动展开。因此,它认为你传入了错误的参数,这里只需要一些整型数值,却传入了数组。

为了将数组展开并传入可变参数,Kotlin使用星号(*)操作符将数组进行展开:

如果在某些场景中,你需要将数组展开并传入到可变参数中,这很有用!

析构声明

在Kotlin语言中,可以通过析构声明单独提取某个对象中的某些字段。看一个例子:

析构声明从一定程度上减少了一些样板代码的编写,更令人惊喜的是,它还可以用在循环和map,甚至lambda表达式中:

注意:如果要对非数据类进行析构处理,你需要手动实现componentN系列函数。这里,我们依然以Person类为例。如果Person是一个非数据类,为了正确析构,你必须这样做:

Elvis Operator

这是一个很特殊的操作符,在Java语言中没有与之对应的操作符。其主要用于简化空值判断,看一个简单的例子:

运行上面的代码,这里将打印null。这个操作符的意思是:如果当前变量为null,就执行操作符后面的语句;否则,直接使用当前变量的值。这意味着不仅可以在操作符后面返回一个与当前变量同类型的默认值,也可以进行其他操作,比如抛出异常等。

如果变量是一个可选的Boolean值,在用于if判断的时候这个操作符很有用。例如你可以这样做:

测测你的Kotlin基础

以上知识点在日常使用中的频率并不高,在Kotlin官方文档中介绍的篇幅也很有限。在学习的时候,你极有可能一眼带过。但在某些特殊场景中,这些知识点却很有用。因此,不妨先记下这些知识点,在需要的时候便能信手拈来了。

如果你已经学习Kotlin语言有一段时间了,想知道学习的效果怎么样,不妨来做一套题 测测你的Kotlin基础(题目在掘金)。目前及格的人较少,希望你是其中一个!

关注欧阳锋工作室,做你最坚强的知识后盾

欧阳锋工作室

欢迎加入Kotlin交流群

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180504A14RHP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券