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

Kotlin从零开始:Packages包和基本功能

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Kotlin From Scratch.
Kotlin From Scratch: Ranges and Collections
Kotlin From Scratch: More Fun With Functions

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

Kotlin是一种编译为Java字节码的现代编程语言。它是免费的,开源的,并有望使Android开发更有趣。 

在前面的文章中,您了解了Kotlin范围和集合。在本教程中,我们将继续通过查看如何使用包来组织代码来学习该语言,然后继续介绍Kotlin中的函数。

1. Packages包

如果您熟悉Java,那么您知道Java使用包对相关类进行分组; 例如, java.util Packages包有许多有用的实用程序类。包是用package关键字声明的,任何带有package声明的Kotlin文件可以包含类,函数或接口的声明。

声明

查看下面的代码,我们已经使用package关键字声明了一个包com.chikekotlin.projectx。另外,我们在这个包中声明了一个类MyClass(我们将在Kotlin中讨论未来职位中的类)。

现在,该类的完全限定名称MyClasscom.chikekotlin.projectx.MyClass

在上面的代码中,我们创建了一个顶级函数(我们很快就会谈到)。与MyClass类似 ,saySomething()函数的完全限定名称是com.chikekotlin.projectx.saySomething

import

在Kotlin中,我们使用import声明来使编译器能够定位要导入的类,函数,接口或对象。另一方面,在Java中,我们不能直接导入函数或仅用于方法的类或接口。 

我们import用来访问函数,接口,类或对象声明的包之外。 

在上面的代码片段中,我们 从不同的包中导入了函数saySomething()  ,然后我们执行了该函数。

Kotlin还支持使用*运算符的通配符导入。这将一次性导入包中声明的所有类,接口和函数。不过不建议这样做 - 通常情况下,要明确导入导入会更好。

导入别名

如果库的类名或函数名称有冲突(例如,它们都声明一个具有相同名称的函数),则可以使用as关键字为该导入的实体指定一个临时名称。

请注意,临时名称仅在分配文件的位置使用。

2.函数

一个函数将一系列执行任务的代码语句分组在一起。函数的实现细节对调用者是隐藏的。

在Kotlin中,函数是使用fun关键字定义的,如下例所示:

在上面的代码中,我们使用单个nameString类型参数定义了一个简单的函数hello()。 这个函数返回一个String类型。对功能参数定义格式name: type,例如  age: Int,price: Double,student: StudentClass。

上面的函数与前一个类似,但请注意这个函数的返回类型为Unit。因为这个函数不会给我们返回任何重要的值 - 它只是打印出一条消息 - 它的返回类型是Unit默认的。 Unit是一个Kotlin对象(我​​们将在稍后的帖子中讨论Kotlin对象),它类似于VoidJava和C中的Void类型。

请注意,如果您没有显式声明返回类型为  Unit,则该类型由编译器推断。

单行功能

单行或单行函数是只有单个表达式的函数。在这个函数中,我们摆脱大括号并 在表达式之前使用符号=。换句话说,我们摆脱了函数块。

上面的功能可以缩短为一行:

查看上面更新的函数,可以看到我们通过删除大括号{},return关键字以及返回类型(由编译器推断)来使代码更加简洁。 

如果需要,仍然可以包含返回类型以更明确。 

命名参数

命名参数通过命名被调用时传递给函数的参数来提供更多可读函数。 

在下面的例子中,我们创建了一个打印我的全名的函数。

要执行上面的函数,我们可以这样调用它:

看看上面的函数调用,我们不知道哪些String类型参数等同于哪些函数参数(尽管一些IDE,比如IntelliJ IDEA可以帮助我们)。函数的用户必须查看函数签名(或源代码)或文档以了解每个参数对应的内容。

在上面的第二个函数调用中,我们在参数值之前提供了参数名称。你可以看到这个函数调用比前一个更清晰,更具可读性。这种调用函数的方式有助于减少错误更换相同类型的参数时可能发生的错误。 .

调用者还可以使用命名参数更改参数的顺序。例如:

在上面的代码中,我们将参数的位置firstName与lastName。参数顺序与命名参数无关,因为编译器会将它们中的每一个映射到正确的函数参数。

默认参数

在Kotlin中,我们可以为其任何参数提供一个函数默认值。如果在函数调用期间没有为参数分配任何参数,则使用这些默认值。要在Java中执行此操作,我们必须创建不同的重载方法。

在这里,在我们的calCircumference()方法中,我们通过为pi参数添加一个默认值来修改该方法Math.PI,这是java.lang.Math包中的一个常量  。 

当我们调用这个函数时,我们可以传递我们的近似值pi 或使用默认值。 

我们来看另一个例子。

在下面的代码中,我们尝试调用该函数,但它不会编译:

在上面的函数调用中,我将我的名字和姓氏传递给函数,并希望使用中间名的默认值。 但是这不会编译,因为编译器很困惑。它不知道参数“Mgbemena”是用于参数middleName还是lastName参数? 

为了解决这个问题,我们可以结合命名参数和默认参数。 

Java互操作性

鉴于Java不支持方法中的默认参数值,因此您需要在从Java调用Kotlin函数时明确指定所有参数值。 但Kotlin为我们提供了通过注释Kotlin函数使Java调用方便的功能@JvmOverloads。这个注解将指示Kotlin编译器为我们生成Java重载函数。

在下面的例子中,我们使用了注释calCirumference()函数@JvmOverloads。

以下代码由Kotlin编译器生成,以便Java调用者随后可以选择要调用哪一个。 

在上次生成的Java方法定义中,该pi参数被省略。这意味着该方法将使用默认pi值。

无限的参数

在Java中,我们可以创建一个方法,通过...在方法的参数列表中输入一个类型后包含一个省略号(...)来接收未指定数量的参数。Kotlin函数也使用vararg 修饰符后跟参数名称来支持此概念  。

vararg 修改允许调用者在逗号分隔的参数列表传递。然后,这个参数列表将被包装到一个数组中。 

当函数有多个参数时,该  vararg 参数通常是最后一个参数。也可以在参数后面有参数vararg,但在调用函数时需要使用命名参数来指定它们。 

例如,在上面的代码中,带有vararg修饰符的参数位于多参数列表中的最后一个位置(这是我们通常所做的)。但如果我们不想要它在最后的位置呢?在下面的例子中,它处于第二个位置。 正如你可以在上面更新的代码中看到的,我们使用最后一个参数的命名参数来解决这个问题。 

正如你可以在上面更新的代码中看到的,我们使用最后一个参数的命名参数来解决这个问题。 

Spread运算符

假设我们想要将一个整数数组传递给我们的printNumbers() 函数。不过,该函数期望将这些值展开到参数列表中。如果你试图直接传入数组给printNumbers(),你会发现它不会被编译。  为了解决这个问题,我们需要使用spread运算符。这个运算符将解压该数组,然后将各个元素作为参数传递给我们的函数。 

为了解决这个问题,我们需要使用spread 运算符*。这个运算符将解压该数组,然后将各个元素作为参数传递给我们的函数。 

通过插入参数列表里面的intsArray前的spread运算符*,现在该代码编译并产生相同的结果,如果我们通过的元素intsArray为逗号分隔的参数列表。 

返回多个值 

有时我们想从一个函数返回多个值。一种方法是使用PairKotlin中的类型创建Pair并返回它。 该Pair结构包含了以后可以访问的两个值。这Kotlin类型可以接受你提供它的构造函数的任何类型。而且,更重要的是,这两种类型甚至不需要相同。 

在上面的功能,我们构建了新  Pair 通过传递  userName 和  userState 变量分别作为第一和第二参数给它的构造,然后回到该  Pair 给调用者。

另外需要注意的是,我们使用了函数中调用require()的getUserNameAndState()函数。 标准库中的这个辅助函数用于为我们的函数调用者提供一个满足的前提条件,否则IllegalArgumentException 就会抛出一个函数  (我们将在未来的文章中讨论Kotlin中的Exceptions)。 可选的第二个参数require() 是一个函数文字,如果抛出异常,则返回要显示的消息。例如,调用  getUserNameAndState()函数并将其-1作为参数传递给它将触发:

IntelliJ IDEA code execution result

Pair中检索数据

在上面的代码中,我们访问Pair从所述第一和第二值通过使用它的类型  firstsecond性质。

但是,这样做有一个更好的方法:解构。

我们在上面更新的代码中所做的是直接将返回Pair类型的第一个和第二个值  分别赋值给变量name和变量state。这个特性被称为解构声明。

返回三个值或更多值

现在,如果你想要一次返回三个值呢?Kotlin为我们提供了另一种有用的类型 Triple。

我相信你们中有些人想知道如果你想返回三个以上的值,该怎么办。当我们讨论Kotlin的数据类时,答案将在后面的文章中。

结论

在本教程中,您了解了Kotlin编程语言中的软件包和基本功能。在Kotlin From Scratch系列的下一篇教程中,您将会更多地了解Kotlin的功能。再见!

要了解有关Kotlin语言的更多信息,我建议访问Kotlin文档。或者在Envato Tuts +上查看我们的其他一些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.