Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序
上QQ阅读APP看书,第一时间看更新

5.2 使用Pair和Triple

元组是小的、有限大小的对象序列。与一些提供创建不同大小元组方法的语言不同,Kotlin提供了两种特定类型:Pair用于大小为2的元组,Triple用于大小为3的元组。当你想快速创建两个或三个作为集合的对象时,请使用这两个。

下面是一个创建字符串Pair(对)的例子:

首先,我们使用构造函数创建Pair的实例。然后使用to()扩展函数(对Kotlin中的任何对象都可以使用)为映射创建一对条目。to()方法创建Pair的实例,目标值作为Pair中的第一个值,参数作为Pair中的第二个值。

使用如此简洁的语法创建一对对象的能力是非常有用的。在编程中,使用一对对象是很常见的。例如,如果你有一个机场代码的列表,并且希望获得每个机场的温度,那么将机场代码和温度表示为一对值是很自然的。在Java中,如果将值保存在数组中,那么处理起来会很麻烦。此外,我们将失去类型安全性,因为机场代码是一个字符串,而温度是一个double值,数组最终将是一个奇臭无比的Object类型。在Java中,我们通常创建一个专用类来保存这两个值。这种方法将提供类型安全性并消除代码中的一些混乱,但它增加了为此创建单独类的负担。Java没有提供令人愉快的方法来处理这个问题。Kotlin的Pair优雅地解决了这个问题。

为了了解Pair的好处,让我们创建一个示例来收集不同机场代码的温度值。

我们使用函数式风格的map()迭代器(你将在第11章中了解到它)遍历集合airportCodes,将列表中的每个机场代码转换为(code, temperature)对。结果是Pair<String, String>的列表。最后,循环遍历Pair列表中的值,来打印每个机场代码和所在地温度的详细信息。对于每一个Pair,我们分别使用first和second属性来获得所包含的两个值。

如果你对这段代码中使用的getTemperatureAtAirport()函数感兴趣,我们将在本书后面实现一个与Web服务对话的工作代码。现在,让我们实现一个伪函数,来将重点放在Pair的好处上。

运行代码并观察程序输出的给定机场的假温度。下面是运行结果的一个样本:

这个例子展示了Pair在实际环境中的用法。在任何需要一对对象或元组的地方使用它。你不仅可以得到简洁的代码,而且在编译时也是类型安全的。

当处理两个值时,Pair非常有用。虽然它看起来很特殊,但它只是在Kotlin标准库中编写的另一个类。你可以在需要的地方创建自己的类。

如果需要三个对象,那么使用Triple而不是Pair。例如,如果需要表示圆的位置,就不必急于创建一个Circle类。相反,你可以创建一个Triple<Int, Int, Double>的实例,其中第一个值表示圆心X,第二个值表示圆心Y,最后第三个值,类型为Double,表示半径。在获得类型安全性的同时,代码也更少了。

Pair和Triple都是不可变的,并且分别用于创建由两个和三个值组成的分组。如果需要对三个以上不可变值进行分组,那么考虑创建一个数据类(参见7.5节)。

Kotlin标准库可以满足你保持两个或三个不可变值的需求。但如果你需要一个可变值的集合,数组可能是一个不错的选择,我们将在下面看到。