likes
comments
collection
share

golang实现简单的stream groupingBy功能

作者站长头像
站长
· 阅读数 65

去年golang还不支持泛型的时候,避免不了要写一堆重复的代码。

之前的示例

func groupByStatus(images []*Image) (normalImage []*Image, offlineImage []*Image) {
   normalImage = make([]*Image, 0)
   offlineImage = make([]*Image, 0)
   for _, img := range images {
      if img.Status == 1 {
         normalImage = append(normalImage, img)
      } else {
         offlineImage = append(normalImage, img)
      }
   }
   return
}

这在java就一行代码。。。。。

images.collect(groupingBy(Image::getStatus));

如今,golang 1.18 正式发布,泛型被千呼万唤始出来,虽然功能不如老大哥Java强大,但是聊胜于无,还不错。

对应的使用泛型改造代码如下:

func groupingBy[K comparable, T any](vs []T, f func(T) K) map[K][]T {
   group := make(map[K][]T)
   for _, v := range vs {
      k := f(v)
      group[k] = append(group[k], v)
   }
   return group
}

list := make([]*Image, 0)
statusMap := groupBy(list, func(t *Image) int32 {
   return t.status
})

函数名称groupingBy后面的[]内,即为泛型type parameter,该定义方式和Java很相似,

public static <T, K> Map<K, List<T>> groupingBy(List<T> list, Function<? super T, ? extends K> classifier) {
...
...
}
转载自:https://juejin.cn/post/7125378655273877540
评论
请登录