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