golang实现简单的stream groupingBy功能
去年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