map-filter-reduce
map filter reduce 这三个操作经常用在数据的处理上,比如数据的统计业务。
下面看一下这三者基本的做法是什么
我们用做饭来进行类比:
- map 30 个进,30 个出,类似于洗菜的过程
- filter 30 个进,15 个出,类似于摘菜
- reduce 15 个进,1 个出,类似于炒菜的过程
下面这个案例,我们要对于一组 string 进行数据处理。map 的过程,我们对这堆 string 进行全部的修饰,filer 过程我们挑选出合适的 string,reduce 过程我们最终输出要的成品
map 的举例
func MapStr(s []string,f func(string)string)[]string{
var newS []string
for _,v := range s{
newS = append(newS,f(v))
}
return newS
}
filter 的举例
func FilterStr(s []string,f func(string)bool)[]string{
var newS []string
for _,v := range s{
if f(v){
newS = append(newS,v)
}
}
return newS
}
reduce 的举例
func ReduceStr(s []string,f func(string)string)string{
var newS string
for _,v := range s{
newS += f(v)
}
return newS
}
func main() {
s := []string{"李明月", "李月", "百伯", "张兰", "武滴滴", "叶赫那拉", "迪丽热巴"}
ns := MapStr(s, func(v string) string {
return v + "同学"
})
fmt.Println(ns)
ns = FilterStr(ns, func(v string) bool {
return len([]rune(v)) > 4
})
fmt.Println(ns)
sum := ReduceStr(ns, func(v string) string {
return v + "-"
})
fmt.Println(sum)
}
这段代码的意思就是首先,我们有一堆学生的名字,我们在名字后面先加上同学,然后我们要把名字本身大于两个字的同学挑出来,并且把他们组成一句话。
map :[李明月同学 李月同学 百伯同学 张兰同学 武滴滴同学 叶赫那拉同学 迪丽热巴同学]
filter :[李明月同学 武滴滴同学 叶赫那拉同学 迪丽热巴同学]
reduce :李明月同学-武滴滴同学-叶赫那拉同学-迪丽热巴同学-
通过这个案例我们发现,map-filter-reduce 本身只是控制逻辑,真正的业务逻辑其实是那个函数类型,所以说 map-filter reduce 也是标准的 控制代码-业务代码
分离设计