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 也是标准的 控制代码-业务代码 分离设计