Skip to content
鼓励作者:欢迎打赏犒劳

数据处理工具类

对标java8的stream!!!!

提取某个属性

go
package main

import (
	"encoding/json"
	"fmt"
)

// 定义结构体来映射 JSON 对象
type Item struct {
	AppID     int    `json:"app_id"`
	EventName string `json:"event_name"`
	Scenario  string `json:"scenario"`
}

// Map 泛型函数:对切片每个元素应用转换函数,返回新的切片
func Map[T, U any](slice []T, mapper func(T) U) []U {
	result := make([]U, 0, len(slice))
	for _, item := range slice {
		result = append(result, mapper(item))
	}
	return result
}

func main() {
	// 原始 JSON 数据
	jsonData := `[{"app_id":1180,"event_name":"test","scenario":"Cold Start"},{"app_id":1181,"event_name":"click","scenario":"Warm Start"}]`

	// 解析 JSON 到结构体切片
	var items []Item
	err := json.Unmarshal([]byte(jsonData), &items)
	if err != nil {
		panic(err)
	}

	// 使用 Map 函数提取 event_name,类似 Java: .stream().map(Item::getEventName).collect()
	eventNames := Map(items, func(item Item) string {
		return item.EventName
	})

	// 输出结果
	fmt.Println("event_names:", eventNames) // 输出: event_names: [test click]
}

过滤

获取第一个值

go
package main

import (
	"fmt"
)

// AppPackage 结构体定义
type AppPackage struct {
	AppID    int64  `json:"app_id"`
	Platform string `json:"platform"`
	MD5      string `json:"md5"`
	SHA1     string `json:"sha1"`
	SHA256   string `json:"sha256"`
}

// FilterFirst 通用函数:在切片中查找第一个满足条件的元素
// 返回 (元素, 是否找到)
func FilterFirst[T any](slice []T, predicate func(T) bool) (T, bool) {
	var zero T
	for _, item := range slice {
		if predicate(item) {
			return item, true
		}
	}
	return zero, false
}

func main() {
	// 示例数据
	appPackages := []AppPackage{
		{AppID: 1001, Platform: "android", MD5: "md5-1", SHA1: "sha1-1", SHA256: "sha256-1"},
		{AppID: 1002, Platform: "ios", MD5: "md5-2", SHA1: "sha1-2", SHA256: "sha256-2"},
		{AppID: 1001, Platform: "android", MD5: "md5-3", SHA1: "sha1-3", SHA256: "sha256-3"}, // 匹配项
		{AppID: 1003, Platform: "web", MD5: "md5-4", SHA1: "sha1-4", SHA256: "sha256-4"},
	}

	// 要查找的条件
	targetAppID := int64(1001)
	targetPlatform := "android"

	// 使用 FilterFirst 查找第一个匹配项
	result, found := FilterFirst(appPackages, func(ap AppPackage) bool {
		return ap.AppID == targetAppID && ap.Platform == targetPlatform
	})

	// 输出结果(模拟 Optional.isPresent())
	if found {
		fmt.Printf("Found: %+v\n", result)
	} else {
		fmt.Println("Not found")
	}
}

获取所有匹配的

go
package main

import (
	"fmt"
)

// AppPackage 结构体定义
type AppPackage struct {
	AppID    int64  `json:"app_id"`
	Platform string `json:"platform"`
	MD5      string `json:"md5"`
	SHA1     string `json:"sha1"`
	SHA256   string `json:"sha256"`
}

// Filter 通用函数:返回切片中所有满足 predicate 条件的元素
func Filter[T any](slice []T, predicate func(T) bool) []T {
	var result []T
	for _, item := range slice {
		if predicate(item) {
			result = append(result, item)
		}
	}
	return result
}

func main() {
	// 示例数据
	appPackages := []AppPackage{
		{AppID: 1001, Platform: "android", MD5: "md5-1", SHA1: "sha1-1", SHA256: "sha256-1"},
		{AppID: 1002, Platform: "ios", MD5: "md5-2", SHA1: "sha1-2", SHA256: "sha256-2"},
		{AppID: 1001, Platform: "android", MD5: "md5-3", SHA1: "sha1-3", SHA256: "sha256-3"}, // 匹配
		{AppID: 1001, Platform: "Android", MD5: "md5-4", SHA1: "sha1-4", SHA256: "sha256-4"}, // 注意大小写
		{AppID: 1003, Platform: "web", MD5: "md5-5", SHA1: "sha1-5", SHA256: "sha256-5"},
	}

	// 要查找的条件
	targetAppID := int64(1001)
	targetPlatform := "android"

	// 使用 Filter 过滤出所有匹配项(注意:字符串比较区分大小写)
	filtered := Filter(appPackages, func(ap AppPackage) bool {
		return ap.AppID == targetAppID && ap.Platform == targetPlatform
	})

	// 输出结果
	if len(filtered) > 0 {
		fmt.Println("Found matching packages:")
		for i, pkg := range filtered {
			fmt.Printf("  [%d] %+v\n", i+1, pkg)
		}
	} else {
		fmt.Println("No matching packages found.")
	}
}

如有转载或 CV 的请标注本站原文地址