Kotlin 中 fold() 和 reduce() 的区别
fold()
和 reduce()
方法是 Iterable 接口的扩展函数。这些方法使用元素列表并将它们转换为单个元素。
由于 Collection 接口实现了 Iterable 接口,因此我们可以将这些方法用于作为 Collection 类的子类型的任何类或接口。
在本文中,我们将通过了解 fold()
和 reduce()
方法的工作原理并为每种情况提供示例来了解它们之间的区别。
Kotlin fold()
方法的作用
转到 IntelliJ 并选择 File > New > Project
创建一个新项目。将项目名称输入为 kotlinFoldAndReduce
,或任何首选名称。在 Language 部分选择 Kotlin,在 Build System 部分选择 Intellij。按创建按钮创建项目。
创建项目后,为 fold()
方法创建文件夹结构 com/fold
,为 reduce()
方法创建 com/reduce
。
在 fold
文件夹下创建一个名为 Main.kt
的新文件,并将以下代码复制并粘贴到该文件中。
package com.fold
class Product(private val name: String,
private val price: Int){
fun getName(): String{
return this.name;
}
fun getPrice(): Int{
return this.price
}
}
val products: List<Product> = listOf(
Product("Hp laptop",200),
Product("Java book",320),
Product("Iphone 13",150)
)
fun main() {
println(products.fold(0) { total, employee ->
total+employee.getPrice()
});
}
我们在这段代码中创建的 listOf()
辅助方法将返回 Product
元素的列表,从返回的列表中,我们可以调用 fold()
方法。
当我们调用 fold()
方法时,我们必须提供将用作计算累加器的初始值。请注意,如果返回的集合为空,则 fold()
方法会返回我们提供的初始值。
运行代码并验证它是否输出列表中所有产品元素的总价格,如下所示。
输出:
670
fold()
方法也可用于检查至少大于或小于初始值的值。下面的示例测试列表中的所有 product
元素以返回至少大于 300 的 product
价格,因此我们将 300
设置为 fold()
函数的初始值。
在将此示例复制并粘贴到文件中之前,请确保在 main 方法中注释掉前面的示例。
fun main() {
println(products.fold(300) { expensiveProduct, product ->
if (product.getPrice() > expensiveProduct)
product.getPrice() else expensiveProduct
});
}
运行代码以验证它是否输出以下值:列表中所有 product
元素的最高价格。
输出:
320
Kotlin reduce()
方法实战
在 reduce
文件夹下创建一个 Main.kt
文件,并将以下代码复制并粘贴到该文件中。
package com.reduce
val list: List<Int> = listOf(20,40,60)
fun main() {
println(list.reduce { sum, value ->
sum + value
});
}
由于 reduce()
方法没有初始值,它使用列表的第一个元素作为初始值。在本例中,值 20
是第一个累加器值,使用 40
的计算返回下一个累加器值。
运行代码并确保它输出以下结果。
输出:
120
在前面的示例中,我们了解到如果列表为空,则返回提供的初始值。reduce()
方法抛出 UnsupportedOperationException
、RuntimeException
,以防列表为空。
为了防止 reduce()
方法抛出 RuntimeException
,我们可以在进行任何计算之前检查列表是否为空。如果 int 类型列表为空,则以下代码返回值 0
。
对上一个示例进行注释,并将此示例复制并粘贴到注释后的文件中。
package com.reduce
val list: List<Int> = listOf()
fun main() {
val data = if (list.isEmpty()) 0
else list.reduce { sum, value ->
sum + value
}
println(data);
}
运行代码并注意记录到控制台的值是 0
,因为我们创建的列表是空的。
输出:
0
结论
在本教程中,我们学习了如何区分 fold()
和 reduce()
扩展函数。我们还介绍了这两种方法如何处理列表为空的情况以避免可能引发的异常。
相关文章
在 Java 中获取文件大小
发布时间:2023/05/01 浏览次数:139 分类:Java
-
Java 提供了不同的方法来获取文件的字节大小。 本教程演示了在 Java 中获取文件大小的不同方法。使用 Java IO 的文件类获取文件大小 Java IO 包的 File 类提供了以字节为单位获取文件大小的功能。
Java 中的文件分隔符
发布时间:2023/05/01 浏览次数:108 分类:Java
-
本篇文章介绍了 Java 中的文件分隔符。Java 中的文件分隔符 文件分隔符是用来分隔目录的字符; 例如,Unix 使用 /,Windows 使用 \ 作为文件分隔符。
Java 中的文件过滤器
发布时间:2023/05/01 浏览次数:193 分类:Java
-
本篇文章介绍如何在 Java 中使用 FileFilter。FileFilter 用于过滤具有特定扩展名的文件。 Java内置包IO和Apache Commons IO为FileFilter提供了类和接口来进行文件过滤操作。
Java 获取 ISO 8601 格式的当前时间戳
发布时间:2023/05/01 浏览次数:132 分类:Java
-
本篇文章介绍了 ISO 8601 日期格式、其重要性及其在 Java 中的使用。 它还列出了一些优点来强调为什么应该使用 ISO 格式来表示日期。
在 Java 中获取数组的子集
发布时间:2023/05/01 浏览次数:142 分类:Java
-
本篇文章介绍了几种在 Java 中获取数组子集的方法。使用 Arrays.copyOf() 方法获取数组的子集 使用 Arrays.copyOfRange() 方法获取数组的子集
用 Java 填充二维数组
发布时间:2023/05/01 浏览次数:110 分类:Java
-
二维数组是基于表结构的,即行和列,填充二维数组不能通过简单的添加到数组操作来完成。 本篇文章介绍如何在 Java 中填充二维数组。
计算 Java 数组中的重复元素
发布时间:2023/05/01 浏览次数:202 分类:Java
-
本篇文章介绍Java计算数组中重复元素的方法。计算 Java 数组中的重复元素。我们可以创建一个程序来计算数组中的重复元素。 该数组可以是未排序的,也可以是已排序的。
Java 中 List 和 Arraylist 的区别
发布时间:2023/05/01 浏览次数:90 分类:Java
-
表示为单个单元的一组单个对象称为集合。 在 Java 中,Collection 是一个具有多个已定义接口和类的框架,用于将一组对象表示为一个单元。 它允许我们操纵