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/12/17 浏览次数:217 分类:Java
-
本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。
如何在 Java 中把 Hashmap 转换为 JSON 对象
发布时间:2023/12/17 浏览次数:187 分类:Java
-
它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。
如何在 Java 中按值排序 Map
发布时间:2023/12/17 浏览次数:171 分类:Java
-
本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map
进行排序,并列出了一些示例代码来理解它。
如何在 Java 中打印 HashMap
发布时间:2023/12/17 浏览次数:192 分类:Java
-
本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。
在 Java 中更新 Hashmap 的值
发布时间:2023/12/17 浏览次数:146 分类:Java
-
本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。
Java 中的 hashmap 和 map 之间的区别
发布时间:2023/12/17 浏览次数:79 分类:Java
-
本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,
在 Java 中获取用户主目录
发布时间:2023/12/17 浏览次数:218 分类:Java
-
这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。
Java 中 size 和 length 的区别
发布时间:2023/12/17 浏览次数:179 分类:Java
-
这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。
Java 中的互斥锁
发布时间:2023/12/17 浏览次数:111 分类:Java
-
了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,