📅  最后修改于: 2023-12-03 14:47:17.832000             🧑  作者: Mango
在Scala集合中,有四种折叠方法:foldLeft
,foldRight
,reduceLeft
和reduceRight
。这些方法都用于将集合的元素折叠成单个值。
foldLeft
foldLeft
从集合的左侧开始将元素折叠到单个值,其语法如下:
def foldLeft[B](z: B)(op: (B, A) => B): B
其中,B
是结果值的类型,z
是折叠操作的初始值,A
是集合元素的类型。op
是一个函数,它接受两个参数,一个是当前的结果值,另一个是集合中的元素。该函数返回一个新的结果值,这个值用作下一次迭代的操作参数。
例如,假设我们有一个包含整数的列表,并且我们想计算所有元素的总和。可以使用foldLeft
方法来实现:
val numbers = List(1, 2, 3, 4, 5)
val sum = numbers.foldLeft(0)((total, next) => total + next)
println(sum) // 15
在这个例子中,我们首先创建了一个包含整数的列表numbers
。然后我们使用foldLeft
方法将列表中的元素加起来。初始值为0,op
函数取两个参数total
(表示当前的结果值)和next
(表示列表中的下一个元素),并返回一个新的结果值,这个值被用作下一次迭代的操作参数。
foldRight
foldRight
从集合的右侧开始将元素折叠到单个值,其语法非常类似于foldLeft
方法:
def foldRight[B](z: B)(op: (A, B) => B): B
其中,B
是结果值的类型,z
是折叠操作的初始值,A
是集合元素的类型。op
是一个函数,它接受两个参数,一个是集合中的元素,另一个是当前的结果值。该函数返回一个新的结果值,这个值用作下一次迭代的操作参数。
例如,假设我们有一个包含字符串的列表,并且我们想将它们连接在一起。可以使用foldRight
方法来实现:
val words = List("Hello", "Scala", "World")
val sentence = words.foldRight("")((next, total) => next + " " + total)
println(sentence) // "Hello Scala World "
在这个例子中,我们首先创建了一个包含字符串的列表words
。然后我们使用foldRight
方法将列表中的元素连接在一起。初始值为空字符串,op
函数取两个参数next
(表示列表中的下一个元素)和total
(表示当前的结果值),并返回一个新的结果值,这个值被用作上一次迭代的操作参数。
reduceLeft
reduceLeft
与foldLeft
非常类似,它从集合的左侧开始将元素折叠到单个值,但它没有初始值参数。它的语法如下:
def reduceLeft[B >: A](op: (B, A) => B): B
其中,B
是结果值的类型,A
是集合元素的类型。op
是一个函数,它接受两个参数,一个是当前的结果值,另一个是集合中的元素。该函数返回一个新的结果值,这个值用作下一次迭代的操作参数。
例如,假设我们有一个包含整数的列表,并且我们想计算所有元素的总和。可以使用reduceLeft
方法来实现:
val numbers = List(1, 2, 3, 4, 5)
val sum = numbers.reduceLeft((total, next) => total + next)
println(sum) // 15
在这个例子中,我们首先创建了一个包含整数的列表numbers
。然后我们使用reduceLeft
方法将列表中的元素加起来。op
函数取两个参数total
(表示当前的结果值)和next
(表示列表中的下一个元素),并返回一个新的结果值,这个值被用作下一次迭代的操作参数。
reduceRight
reduceRight
与reduceLeft
非常类似,它从集合的右侧开始将元素折叠到单个值,但它没有初始值参数。它的语法非常类似于reduceLeft
方法:
def reduceRight[B >: A](op: (A, B) => B): B
其中,B
是结果值的类型,A
是集合元素的类型。op
是一个函数,它接受两个参数,一个是集合中的元素,另一个是当前的结果值。该函数返回一个新的结果值,这个值用作下一次迭代的操作参数。
例如,假设我们有一个包含字符串的列表,并且我们想将它们连接在一起。可以使用reduceRight
方法来实现:
val words = List("Hello", "Scala", "World")
val sentence = words.reduceRight((next, total) => next + " " + total)
println(sentence) // "Hello Scala World "
在这个例子中,我们首先创建了一个包含字符串的列表words
。然后我们使用reduceRight
方法将列表中的元素连接在一起。op
函数取两个参数next
(表示列表中的下一个元素)和total
(表示当前的结果值),并返回一个新的结果值,这个值被用作上一次迭代的操作参数。
四种折叠方法:foldLeft
,foldRight
,reduceLeft
和reduceRight
都是非常有用的Scala集合操作,它们允许我们将集合的元素折叠成单个值。这些方法的语法都非常类似,但它们的行为略有不同,因此我们需要在使用它们时进行选择。 掌握这些方法可以使Scala程序员更加高效地运用集合进行编程。