Skip to content

Stream Collections for Go. Inspired in Java 8 Streams

License

Notifications You must be signed in to change notification settings

xuender/go-stream

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

87 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-stream

GoCI Go Report Card codecov GoDoc GitHub license GitHub issues GitHub stars

Stream Collections for Go. Inspired in Java 8 Streams.

Use channel and Go1.18+ generic support.

✨ xuender/go-stream is a Java 8 Streams style Go library based on Go 1.18+ Generics.

πŸš€ Install

To install the library and command line program:

go get -u github.com/xuender/go-stream@latest

πŸ’‘ Usage

You can import stream using:

import "github.com/xuender/go-stream"

NewBase

New BaseStream.

package main

import (
  "fmt"

  "github.com/xuender/go-stream"
)

func main() {
  base := stream.NewBase(stream.Range2Channel(5)).
    Peek(func(num int) { fmt.Println("peek1:", num) }).
    Filter(func(num int) bool { return num > 2 }).
    Peek(func(num int) { fmt.Println("peek2:", num) })

  fmt.Println(base.Count())
}

Output:

peek1: 0
peek1: 1
peek1: 2
peek1: 3
peek1: 4
peek2: 3
peek2: 4
2

[play]

Parallel

BaseStream to ParallelStream.

package main

import (
  "fmt"
  "math/rand"
  "time"

  "github.com/xuender/go-stream"
)

func main() {
  stream.NewBase(stream.Range2Channel(1000)).
    Parallel(100).
    Filter(func(num int) bool { return num%7 == 0 }).
    ForEach(func(num int) {
      dur := time.Duration(rand.Intn(1000)) * time.Millisecond

      time.Sleep(dur)
      fmt.Printf("%d\t%s\n", num, dur)
    })
}

Output:

623     2ms
497     2ms
273     15ms
252     26ms
616     33ms
756     10ms
91      47ms
7       59ms
21      59ms
602     59ms
350     78ms
28      81ms
...

[play]

Map

Integer to string.

package main

import (
  "fmt"

  "github.com/xuender/go-stream"
)

func main() {
  base := stream.Map(
    stream.Range2Channel(100),
    func(num int) string { return fmt.Sprintf("[%d]", num) },
  ).Limit(3)

  for i := range base.C {
    fmt.Println(i)
  }
}

Output:

[0]
[1]
[2]

[play]

FlatMap

package main

import (
  "fmt"

  "github.com/xuender/go-stream"
)

func main() {
  stream.FlatMap(
    stream.Slice2Channel([]int{0, 0}, []int{1, 2}, []int{2, 4}),
    func(num int) string { return fmt.Sprintf("[%d]", num) },
  ).ForEach(func(str string) {
    fmt.Println(str)
  })
}

Output:

[0]
[0]
[1]
[2]
[2]
[4]

[play]

Sorted

OrderedStream sorted.

package main

import (
  "fmt"

  "github.com/xuender/go-stream"
)

func main() {
  stream.NewOrdered(stream.Slice2Channel(3, 2, 7, 1)).
    Sorted().
    ForEach(func(num int) {
      fmt.Println(num)
    })
}

Output:

1
2
3
7

[play]

πŸ›© Functions

Function Type State
AnyMatch Terminal operations, short-circuiting √
AllMatch Terminal operations, short-circuiting √
Count Terminal operations √
Filter Intermediate operations, Parallel √
FindFirst Terminal operations, short-circuiting √
ForEach Terminal operations, Parallel √
Limit Intermediate operations √
NoneMatch Terminal operations, short-circuiting √
Parallel Intermediate operations √
Peek Intermediate operations, Parallel √
Skip Intermediate operations √
Sort Intermediate operations √
Distinct Intermediate operations, Comparable √
Max Terminal operations, Ordered √
Min Terminal operations, Ordered √
Reduce Terminal operations, Ordered √
Sorted Intermediate operations, Ordered √
Sequential Intermediate operations, Parallel √
Map Function √
FlatMap Function √

πŸ“ License

Β© ender, 2023~time.Now

MIT LICENSE

About

Stream Collections for Go. Inspired in Java 8 Streams

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published