Skip to content

泛型函数式工具 ​

难度:⭐⭐ 中等 ​

考点 ​

  • Go 泛型语法(类型参数)
  • comparable 约束
  • 多类型参数

提示 ​

  1. [T any] 表示接受任意类型
  2. [T comparable] 表示类型可用 == 比较
  3. [T any, U any] 多类型参数用于输入输出类型不同的场景

参考答案(Go) ​

点击展开参考答案
go
//go:build ignore

package answer

func Filter[T any](slice []T, fn func(T) bool) []T {
	var result []T
	for _, v := range slice {
		if fn(v) {
			result = append(result, v)
		}
	}
	if result == nil {
		return []T{}
	}
	return result
}

func Map[T any, U any](slice []T, fn func(T) U) []U {
	result := make([]U, len(slice))
	for i, v := range slice {
		result[i] = fn(v)
	}
	return result
}

func Reduce[T any, U any](slice []T, init U, fn func(U, T) U) U {
	acc := init
	for _, v := range slice {
		acc = fn(acc, v)
	}
	return acc
}

func Contains[T comparable](slice []T, target T) bool {
	for _, v := range slice {
		if v == target {
			return true
		}
	}
	return false
}

func Unique[T comparable](slice []T) []T {
	seen := make(map[T]struct{})
	var result []T
	for _, v := range slice {
		if _, ok := seen[v]; !ok {
			seen[v] = struct{}{}
			result = append(result, v)
		}
	}
	return result
}

func GroupBy[T any, K comparable](slice []T, keyFn func(T) K) map[K][]T {
	result := make(map[K][]T)
	for _, v := range slice {
		key := keyFn(v)
		result[key] = append(result[key], v)
	}
	return result
}

持续学习,持续构建。