模仿Java Stream API 操作数组/切片

https://gist.github.com/songtianyi/ac1c3d753abad85b226ed615b0f0ec80 ```go package main import ( "fmt" "reflect" ) type Data struct { foo string bar string enabled bool } type stream struct { data []interface{} } // copy struct slice to slice of interface func NewStream(data interface{}) *stream { s := reflect.ValueOf(data) // check if s.Kind() != reflect.Slice { panic("not slice :(") } ret := make([]interface{}, s.Len()) for i := 0; i < s.Len(); i++ { ret[i] = s.Index(i).Interface() } return &stream{ data: ret, } } // filter function type boolFilter func(d interface{}) bool func (s *stream) filter(f boolFilter) *stream { a := make([]interface{}, 0) for _, d := range s.data { if f(d) { a = append(a, d) } } s.data = a return s } func (s *stream) count() int { return len(s.data) } func main() { var data = []*Data{ { "music", "on", true, }, { "dota", "game", false, }, } // --- 类似 Java8 Stream API out := NewStream(data).filter( // filter by field foo func(d interface{}) bool { return d.(*Data).foo == "music" }).count() // --- fmt.Println(out) } ```
已邀请:

h12 - https://h12.io/about

赞同来自: GanymedeNil Xanthus Tricker

terribly bad taste

xkey - go

赞同来自: javasgl

go就是go,为啥总想着按XX语言的方式写呢

zhaoyun4122

赞同来自: javasgl

为什么要像java一样写~那为什么补直接java

singlethread - 5年老菜鸟,可以用任意语言写hello world,喜欢go

赞同来自: songtianyi

- 反射可能会存在性能问题
- 大量使用`interface{}`放弃了类型安全
- 也许可以缓存`reflect`出来的结果,持续的向stream里面添加数据来减少反射
- 用`go`的一般是`java`黑,所以。。。。
还有优化空间,先放出来,不知道大家感兴趣不。
大家都是从出发点来反驳 不太认同,我觉得我的出发点没有问题。
从出发点得出的结果好不好我不确定,这是值得讨论的。

要回复问题请先登录注册