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

https://gist.github.com/songtianyi/ac1c3d753abad85b226ed615b0f0ec80

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黑,所以。。。。

songtianyi

赞同来自:

还有优化空间,先放出来,不知道大家感兴趣不。

songtianyi

赞同来自:

大家都是从出发点来反驳 不太认同,我觉得我的出发点没有问题。 从出发点得出的结果好不好我不确定,这是值得讨论的。

要回复问题请先登录注册