Scala--函数foldLeft使用

作者: 环境与方法 | 来源:发表于2019-05-11 19:12 被阅读1次

简单介绍一下,Scala语言中,foldLeft函数的两个使用场景:

  1. 列表内数值的相加,作用相当于sum;
  2. 变换后的Map集合有重复key值,并且需要根据key值合并

场景一:列表数值相加,先上代码:

scala> val list1 = List(1,2,3,4,5)
list1: List[Int] = List(1, 2, 3, 4, 5)

scala> println(list1.foldLeft(0) { (sum, i) => sum + i})
15

scala> println(list1.sum)
15

从代码中可以看出,foldLeft函数此时的作用相当于sum。foldLeft后加圆括号,圆括号中写入初始值,因为要算整个List中每一个元素的和,因此,此时初始值为Int型的0。 之后的 (sum, i) => sum + i} 则表示,对于每一个List中的i元素,将i与sum相加,并将结果保存在sum中。foldLeft是从左往右遍历,而与它相对应的是函数foldRight,foldRight从右向左遍历。

场景二: 合并Map重复key值
若一个Map中key为单词,value为这个单词的词频,我们若想根据单词的长度统计不同长度单词的总词频,就会需要foldLeft函数出场

在Scala的Map集合操作中,没有直接将两个Map根据key值合并value的操作,若是直接将两个Map相加,那么相同的key的值将会被后边的值覆盖,例如:

scala> val map1 = Map("aa" -> 1.0, "bb" -> 2.0)
map1: scala.collection.immutable.Map[String,Double] = Map(aa -> 1.0, bb -> 2.0)

scala> val map2 = Map("aa" -> 2.0, "cc" -> 4.0)
map2: scala.collection.immutable.Map[String,Double] = Map(aa -> 2.0, cc -> 4.0)

scala> println(map1 ++ map2)
Map(aa -> 2.0, bb -> 2.0, cc -> 4.0)

可见,直接暴力相加的话会覆盖重复key的value值,如果想计算不同长度单词的词频,单纯将map中的key变换为key的长度,再对value进行操作是不可取的。

foldLeft可以对map的value值进行相加,再这个场景下可以这样写:

scala> val wordsMap = Map("apple" -> 20, "pear" -> 10, "pineapple" -> 25, "grape" -> 30)
wordsMap: scala.collection.immutable.Map[String,Int] = Map(apple -> 20, pear -> 10, pineapple -> 25, grape -> 30)

scala> val wordFreqCount = wordsMap.foldLeft(Map.empty[Int, Int]) {
     |       case (newMap, (fruit, count)) =>
     |         newMap + (fruit.length -> (count + newMap.getOrElse(fruit.length, 0)))
     |     }
wordFreqCount: scala.collection.immutable.Map[Int,Int] = Map(5 -> 50, 4 -> 10, 9 -> 25)

首先在foldLeft函数中传入参数,即新map的初始值Map.empty[Int, Int], 然后根据case模式匹配,定义新map为newMap,对每一个原map中的值(fruit, count), 拿出fruit的单词length,并且相加,赋到newMap中,就能得到我们想要的结果。

相关文章

  • Scala--函数foldLeft使用

    简单介绍一下,Scala语言中,foldLeft函数的两个使用场景: 列表内数值的相加,作用相当于sum; 变换后...

  • Scala的foldLeft和foldRight

    可以参照对该函数的解析学习scala源码分析的方法 /:以及:\ 可以看出是foldLeft和foldRight的...

  • Scala:fold,foldLeft和foldRight区别与

    从本质上说,fold函数将一种格式的输入数据转化成另外一种格式返回。fold, foldLeft和foldRigh...

  • foldLeft && foldRight

    Let,s see something (1 to 3).foldRight(3)(_-_) == -1 (1 t...

  • Kotlin函数式编程 (4)✔️内联函数

    ✔️自定义内联函数使用 let 函数使用 with 函数使用 apply 函数with 和 apply 函数区别?...

  • swift基础语法(函数)

    一、函数的基本使用 二、函数的使用注意 --- 参数名 三、函数的使用注意 --- 函数类型 四、函数嵌套

  • Kotlin 函数

    函数声明 Kotlin 中的函数使用 fun 关键字声明: 函数用法 调用函数使用传统的方法: 调用成员函数使用点...

  • 函数 一

    函数基本使用 函数基本返回值 函数的参数使用

  • swift函数与闭包

    一:声明函数,调用函数: 使用func 来声明一个函数,使用名字和参数来调用函数,使用->来制定函数返回值。形式:...

  • 工厂函数(factory)与构造函数(constructor)

    工厂函数(factory) 使用工厂函数新建对象: 构造函数(constructor) 使用构造函数创建新对象: ...

网友评论

    本文标题:Scala--函数foldLeft使用

    本文链接:https://www.haomeiwen.com/subject/zdqtaqtx.html