Scala foldLeft函数介绍及应用

1,147 阅读3分钟

Scala foldLeft

Scala foldLeft简介

Scala foldLeft函数可以用于Scala中的集合数据结构。同时,foldLeft也适用于集合的不可变和可变数据结构。这个函数需要两个参数作为参数。一个是二进制运算符,第二个参数的集合总是指向集合的当前元素。这个二进制运算符用于结算集合中的元素。

Scala foldLeft的语法:

这个方法需要两个参数作为参数,它从左到右进行遍历,所以被命名为 foldLeft() 方法。

下面是scala社区定义的该方法的语法,具体如下。在接下来的一行中,我们有一个练习的例子来更好地理解scala中的foldLeft函数。

def foldLeft[B](z: B)(op: (B, A) ⇒ B): B

例子:

val result = list.foldLeft(1.1)(_ + _)

在这里,我们给函数的初始值为1.1,并尝试对列表中的所有元素进行求和。这可以应用于任何集合数据结构。

foldLeft函数如何在Scala中工作?

foldLeft函数从左到右遍历集合数据结构中的元素,它在Scala中被命名为foldLeft()函数。它需要两个参数,我们也可以通过这个函数指定初始值。这个函数是一个递归函数,可以帮助我们在编程时避免出现堆栈溢出异常。

这个函数是scala中TraversableOnce的成员函数。TraversableOnce是为了消除Traversable和Iterator的重复代码而建立的一个trait,它实现了常见的函数。这个trait也包含抽象方法,Traversable和Iterator提供了这个抽象方法的实现。

现在我们将看到一个例子,我们将初始化我们的元素列表,并试图对其应用 foldLeft 函数。

例子:

代码:

val myList: Seq[Int] = Seq(10, 30, 50, 60)
println(myList)

在这个例子中,我们正在创建一个包含4个变量的整数序列,并试图打印出序列的元素。

代码:

val result = myList.foldLeft(0)(_ + _)
println("result is  ::" + result)

在创建序列后,现在我们要对序列中的所有元素进行求和。为此,我们使用 foldLeft 函数。首先,我们对我们的集合调用foldLeft,然后是我们指定的初始值0。之后,我们使用二进制运算符+来获得集合序列中所有元素的总和。我们可以根据需要在这里使用任何二进制运算符。

我们也可以对字符串类型的集合数据结构使用 foldLeft 函数;我们将看到一个例子。

在这里,我们正在创建一个List if string,其中包含了许多元素。之后,我们只是打印我们新创建的所有列表。

例子

代码

val myList: List[String] = List("amit", "sumit", "vinit", "lalti", "minit")
println(myList)

例子

代码

println(s"using special charcter = ${myList.foldLeft("")((x, y) => x + y + " ********* ")}")

现在我们试图在我们的每个元素后面添加一些字符串,为此,我们使用foldLeft函数,在这个函数中,我们追加了我们想要显示的字符串。

我们也可以将一个函数获得的值直接传递给 foldLeft 函数来串联字符串。

例子

代码

val myList: List[String] = List("amit", "sumit", "vinit", "lalti", "minit")
println(myList)
val valFun: (String, String) => String = (a, b) => a + b + " Donut "
var result = myList.foldLeft("")(valFun)
println(result)

因此,在上面的例子中,我们是直接将函数的值传递给 foldLeft 函数。这只是一个简单的方法,对开发者来说更容易阅读。但我还是建议采用第一种方法。

Scala foldLeft的例子

下面是Scala foldLeft的例子。

例子#1

在这个例子中,我们通过使用scala的foldLeft函数来修改字符串列表中的元素。

代码:

object Main extends App{
// Your code here!
val myList: List[String] = List("amit", "sumit", "vinit", "lalti", "minit")
println("list before foldLeft function is  :::: ")
println(myList)
var result  = myList.foldLeft("")((x, y) => x + y + " ********* ")
println("list after foldLeft function is  :::: ")
println(result)
//println(s"using special character = ${myList.foldLeft("")((x, y) => x + y + " ********* ")}")
}

输出:

Scala foldLeft 1

例子 #2

在这个例子中,我们要找出List集合数据结构中所有元素的总和。

代码:

object Main extends App{
// Your code here!
val myList: List[Int] = List(100, 200, 300, 400, 500, 600, 700)
println("list before foldLeft function is  :::: ")
println(myList)
var result  = myList.foldLeft(0)(_+_)
println("list after foldLeft function is  :::: ")
println(result)
//println(s"using special character = ${myList.foldLeft("")((x, y) => x + y + " ********* ")}")
}

输出:

Scala foldLeft 2

例子 #3

在这个例子中,我们通过使用 foldLeft 函数在整数列表中应用不同的二进制运算符。

代码:

object Main extends App{
// Your code here!
val myList: List[Int] = List(100, 200, 300, 400, 500, 600, 700)
println("list before foldLeft function is  :::: ")
println(myList)
var result  = myList.foldLeft(0)(_-_)
println("list after foldLeft function is  :::: ")
println(result)
var result1  = myList.foldLeft(0)(_*_)
println("list after foldLeft function is  :::: ")
println(result1)
//println(s"using special character = ${myList.foldLeft("")((x, y) => x + y + " ********* ")}")
}

输出:

different binary operator on the list of integer

例子 #4

在这个例子中,我们通过使用scala中的foldLeft函数中的max函数来找到集合的最大值。

代码:

object Main extends App{
// Your code here!
val myList: List[Int] = List(100, 200, 300, 400, 500, 600, 700)
println("list before foldLeft function is  :::: ")
println(myList)
var result  = myList.foldLeft(0)(_ max _)
println("list after foldLeft function is  :::: ")
println(result)
//println(s"using special character = ${myList.foldLeft("")((x, y) => x + y + " ********* ")}")
}

输出:

maximum value of the collection by using the max function

结论

foldLeft函数遍历了集合数据结构中的每个元素,帮助我们对元素进行操作。因此,它更加精简和简化,对程序员来说是不可测试的。同时,它也减少了代码的行数。