
数据处理工具类
对标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.")
}
}