Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

使用Kotlin编写多功能Android APP,包括:Lambdas表达式,Null安全等

by
Length:LongLanguages:
This post is part of a series called Coding Android Apps in Kotlin.
Coding Functional Android Apps in Kotlin: Getting Started

Chinese (Simplified) (中文(简体)) translation by Zhang Xiang Liang (you can also view the original English article)

在这系列中,我们深入了解了Kotlin,它是在Java虚拟机(JVM)中运行的用于编写Android APP的现代编程语言。 

虽然Kotlin不是设计用于在JVM上运行的唯一编程语言,但它确实为Android开发人员提供了很多帮助。所以如果你最近对Android开发的Java部分感到沮丧,那么你可以考虑使用Kotlin。

在前两篇文章中,我们介绍了以下内容:

现在,你可以使用具有相同结果的Kotlin代码替换项目的Java部分,让我们继续观察Kotlin 在Java 方面的优势。

在最后一部分中,我们将探讨一些更高级的Kotlin,有些功能在Java中实现需要更冗长的代码,或者Java根本实现不了,但是使用Kotlin可以实现。

在本文结尾处,你将了解如何使用Kotlin减少大量样板代码,继承已有的类并创建新功能,并且不再有NullPointerException异常。  

不再有Null异常

你测试代码时遇到过多少次NullPointerException异常?很明显允许开发人员将null赋给对象引用不是最好的选择! 尝试使用有空值的对象引用是许多跨编程语言(包括Java)的巨大漏洞。 为此,Java 8 专门添加了@NonNull 注解来尝试修复NullPointerException类型缺陷。

问题在于Java允许将引用类型的任何变量设置为null - 但是,如果在任何时候尝试使用指向null的引用,该变量就不知道在哪里查找,因为该对象实际上并不存在。  此时,JVM无法继续执行正常的执行路径 - 你的APP将崩溃,你将遇到一个NullPointerException异常。尝试调用空引用的方法或尝试访问空引用的字段都将触发NullPointerException异常。

如果你已经经历了痛苦的NullPointerException(而且在某些时候我们没有遇到),那么有一个好消息:空指针安全被集成到Kotlin语言中。Kotlin编译器不允许为对象引用分配空值,因为它在编译期间特别检查代码中是否存在可能的空对象。 如果Kotlin编译器检测到NullPointerException在运行时可能会抛出一个错误,那么你的代码将在编译时失败。

Kotlin的空指针安全设计意味着你(几乎)永远不会遇到NullPointerException异常。唯一的例外是如果通过错误地使用Kotlin的特殊操作符触发NullPointerException,或者如果使用其中一个操作符来故意触发NullPointerException(本文稍后将详细介绍操作符)。

空指针安全实践

在Kotlin中,所有变量在默认情况下都被视为不可为空,因此尝试为变量分配空值将导致编译错误。例如,以下将编译不过:

如果你想要一个变量来接受一个空值,那么你需要将这个变量显式标记为可空。这与Java完全相反,Java中默认情况下,每个对象都被认为是可空的,这是Java中出现如此常见的NullPointerException异常的很大一部分原因。

如果你想明确声明一个变量能接受一个空值,那么你需要附加一个?给变量类型。例如,以下将编译通过:

当编译器看到这种声明时,它会认识到这是一个可空的变量,它将会有所不同,不同之处在于阻止你在这个空指针引用上调用一个方法或访问这个属性,再次帮助你避免那些讨厌的NullPointerExceptions 。 例如,以下将编译通过:

虽然Kotlin的设计意味着很难遇到来自Kotlin代码的NullPointerExceptions异常,但如果你的项目具有Kotlin和Java的混合,那么项目的Java部分仍然可能导致NullPointerExceptions异常。

如果你正在使用Kotlin和Java的混合(或者你特别需要在您的Kotlin代码中引入空值),那么Kotlin包括一系列特殊操作符,旨在帮助优雅地处理你遇到的任何空值。

1.安全调用操作符

安全调用操作符 ?.提供了一种处理可能包含空值引用的方法,同时确保对此引用的任何调用都不会导致NullPointerException异常。

当你将安全调用操作符添加到引用时,该引用将被测试一个空值。如果值为null,则返回null,否则将按照你的意图使用对象引用。 虽然可以使用if语句实现相同的效果,但安全调用操作符允许你以更少的代码执行相同的工作。

例如,以下内容a.size只有在a不为null的情况下才返回,否则返回null:

也可以将安全调用操作符连接在一起:

如果本系列中的任何表达式为空,则结果将为null,否则结果将为请求的值。

2.Elvis操作符

有时你会有一个可能包含一个空值的表达式,但是你不希望抛出NullPointerException异常即使这个值确实为null。  

在这些情况下,你可以使用Kotlin的Elvis操作符?:来提供一个替代值,当值为零时,这个值将被使用,这也是防止代码中空值传播的好方法。

让我们来看看Elvis操作符合的一个例子:

这里,如果Elvis操作符左侧的值不为 null,那么左侧的值将返回(name)。但是,如果Elvis操作符左侧的值为 null,则将返回右侧的表达式,这在本例中为N/A。  

3. !!操作符

如果你想强制你的Kotlin代码抛出一个Java风格的NullPointerException异常,那么你可以使用!!运算符。例如:

在这里,我们使用!!运算符来声明firstName变量不为空。只要firstName包含有效的引用,那么将变量number设置为length字符串。 如果firstName不包含有效的引用,那么Kotlin会抛出一个NullPointerException异常。

Lambda表达式

lambda表达式表示匿名函数。Lambdas是减少代码量(这些代码随时可能被执行)的一个好方法,例如编写侦听器和回调。 

Java 8引入了lambda表达式,现在这些表达式在Android Nougat系统中得到了支持。虽然这个功能不是Kotlin独有的功能,但还是值得一看。 另外,如果你正在开发包含Kotlin和Java代码的项目,那么现在可以在整个项目中使用lambda表达式!

lambda表达式包括以下格式排列一组参数,lambda运算符(->)和函数体:

在Kotlin中构造lambda表达式时,需要考虑以下规则:

  • lambda表达式应该被花括号括起来。

  • 如果表达式包含任何参数,则需要在->箭头符号之前声明它们。

  • 如果正在使用多个参数,那么应该用逗号分隔。

  • 函数体在->标志后面。

lambda表达式的主要优点是它们允许你定义匿名函数,然后立即将这些函数作为表达式传递。这可以让你比Java 7和更早的版本更简洁地执行许多常见的开发任务,因为你不再需要在抽象类或接口中编写函数的规范。 事实上,Java 7及更早的版本中缺少lambdas是为什么在Android中编写监听器和回调如此笨重的原因。  

我们来看一个常见的例子:将一个点击监听器添加到按钮。在Java 7及更早版本中,通常需要以下代码:

但是,Kotlin lambda功能让你使用单行代码设置点击监听器:

虽然这已经很简单和容易阅读,但是我们可以进一步 - 如果一个函数将另一个函数作为最后一个参数,那么你可以将它传递到括号列表之外:

如果函数只有一个函数作为参数,则可以完全删除括号:

扩展功能

与C#类似,Kotlin允许你向现有类添加新功能。所以如果你认为一个类缺少一个有用的方法,那么为什么不通过扩展函数添加它?

通过你想要继承的类名前缀创建扩展函数。

例如:

请注意,扩展函数中的this关键字对应于AppCompatActivity 实例。

在这个例子中,你只需要导入AppComptActivityToast类到.kt文件,然后你就可以在继承类的实例上调用.记号。

当涉及到Android开发时,你可能会发现扩展函数对于ViewGroups加载 自己特别有用,例如:

所以不必写下列内容:

你可以简单地使用你的扩展函数:

单例对象

在Java中,创建单例通常是非常详细的,要求你使用私有构造函数创建一个类,然后创建实例为私有属性。

最终的结果通常是这样的:

Kotlin不是声明一个类,而是可以在一行代码中定义一个与单例语义相同的单个对象:

然后,你可以立即使用此单例,例如:

结论

在本文中,我们深入了解了Kotlin的空指针安全,并看到如何通过使用一系列特殊操作符来确保你的Android项目是空指针安全的,即使它们包含Java和Kotlin代码的混合。我们还研究了如何使用lambda表达式来简化Android中的一些常见开发任务,以及如何向现有类添加新功能。

结合我们在第1部分中了解到的内容:Java vs. Kotlin和第2部分:入门,现在,你可以使用Kotlin编程语言构建有效的Android APP。

使用Kotlin语言编程,为什么不查看我们的其他课程和Android教程呢?

Envato qr branded
关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.