黑猴子的家:Scala 折叠、化简、扫描

1、reduceleft 和 reduceright

折叠,化简:将二元函数引用于集合中的函数
// reduceleft 和 reduceright 指得是上一次运算的结果放在左边或右边
//值的方向
//reduceleft reduceright 默认实现是fold

val list = List(1, 2, 3, 4, 5,6,7)
val i1 = list.reduceLeft(_ - _)
val i1 = list.reduceLeft( (x,y)=>(x-y) ) 
val i2 = list.reduceRight(_ - _)
println(i1)
println(i2)

尖叫提示:reduceleft 是fold是简化版,也需要初始值,reduceleft的初始值是集合的第一个值

reduceLefft(_ - _)
这个函数的执行逻辑如图所示
执行逻辑:((((((1-2)-3)-4)-5)-6)-7)

9193428-19e622e9d13f60a8.png

reduceRight(_ - _)反之同理
执行逻辑:(1-(2-(3-(4-(5-(6-7))))))

9193428-f68c2eb8535e0ac1.png

2、折叠,化简:fold

fold函数将上一步返回的值作为函数的第一个参数,继续传递参与运算,直到list中的所有元素被遍历。可以把reduceLeft看做简化版的foldLeft。相关函数:fold,foldLeft,foldRight,可以参考reduce的相关方法理解。

(1)fold

val list2 = List(1, 9, 2, 8)
//fold默认从左边开始,初始值是5
val i4 = list2.fold(5)((sum, y) => sum + y)
println(i4)

尖叫提示:fold和foldleft的结果是一样的,因为fold默认是从左边开始的

(2)foldLeft

val list7 = List(1,2,3,4,5,6,7)
println(list7.foldLeft(0)((sum,y) => sum-y))
println(list7.foldLeft(0)(_-_))

使用符号/:代替foldleft,0是初始值
val i6 = (0 /: list4)(_ - _)
println(i6)
println((0/:list7)((sum,y) => sum-y))
println((0/:list7)(_-_))

尖叫提示:/: 符号代表 foldleft

(3)foldRight

val list7 = List(1,2,3,4,5,6,7)
val i5 = list7.foldRight(100)(_ - _)
println(i5)
println("右----------")
println(list7.foldRight(0)(_-_))
println(list7.foldRight(0)((sum,y) => sum-y))

println("简化-----")
println((list7:\0)(_-_))
println((list7:\0)((y,sum) => y-sum))

尖叫提示:foldLeft和foldRight有一种缩写方法对应分别是:/:和:\,符号为什么这么设计呢?
左边放在左边,右边放在右边,都让:冒号对准集合
:\符号代表 foldright

3、统计一句话中,各个文字出现的次数

println("笑里藏刀--")
val sentence = "一首现代诗《笑里藏刀》:哈哈哈哈哈哈哈哈哈哈刀哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈"
val charToInt1 = (Map[Char,Int]()/:sentence)((m,c) => m + (c -> (m.getOrElse(c,0) + 1)))
println(charToInt1)

4、扫描

这个理解需要结合上面的知识点,扫描,即对某个集合的所有元素做fold操作,但是会把产生的所有中间结果放置于一个集合中保存。

println("扫描---------------")
val scanleft1 = ((1 to 10) scanLeft(0))(_+_)
val scanleft2 = (1 to 10).scanLeft(0)(_+_)
println(scanleft1)
println(scanleft2)

5、总结

折叠就是把多个元素,给整合成一个元素
化简就是用符号来代替语法,简化语法操作
扫描就是保存折叠运算过程中的中间结果
只要在脑海中建立这样的条件反射就可以了,建立条件反射的目的是,当你遇到需求的时候,你能想到解决方案,如果你没有建立这样的条件反射,遇到需求,这个知识点你也会,但是你关联不到一起,需求知道,这个知识点也会,但是就是不知道,这个需求是可以映射到这个知识点的,建立需求和知识点的条件反射是最重要的,这是最重要的,我学,我什么都学会了,但是我就是不会用,这说明,当你面对需求的时候,你想不起来用哪个知识点

转载于:https://www.jianshu.com/p/fb03892a209a

猜你喜欢

转载自blog.csdn.net/weixin_33734785/article/details/91182440