diff --git a/stream/stream.go b/stream/stream.go index 4a4b84d..eb707dc 100644 --- a/stream/stream.go +++ b/stream/stream.go @@ -34,7 +34,7 @@ import ( // AnyMatch(predicate func(item T) bool) bool // NoneMatch(predicate func(item T) bool) bool // ForEach(consumer func(item T)) -// Reduce(accumulator func(a, b T) T) (T, bool) +// Reduce(accumulator func(a, b T) T) T // Count() int // FindFirst() (T, bool) @@ -234,6 +234,22 @@ func (s stream[T]) NoneMatch(predicate func(item T) bool) bool { return !s.AnyMatch(predicate) } +// ForEach performs an action for each element of this stream. +func (s stream[T]) ForEach(action func(item T)) { + for _, v := range s.source { + action(v) + } +} + +// Reduce performs a reduction on the elements of this stream, using an associative accumulation function, and returns an Optional describing the reduced value, if any. +func (s stream[T]) Reduce(init T, accumulator func(a, b T) T) T { + for _, v := range s.source { + init = accumulator(init, v) + } + + return init +} + // Count returns the count of elements in the stream. func (s stream[T]) Count() int { return len(s.source) diff --git a/stream/stream_test.go b/stream/stream_test.go index cd0ffa4..45f68b1 100644 --- a/stream/stream_test.go +++ b/stream/stream_test.go @@ -222,3 +222,28 @@ func TestStream_NoneMatch(t *testing.T) { assert.Equal(true, result1) assert.Equal(false, result2) } + +func TestStream_ForEach(t *testing.T) { + assert := internal.NewAssert(t, "TestStream_ForEach") + + stream := FromSlice([]int{1, 2, 3}) + + result := 0 + stream.ForEach(func(item int) { + result += item + }) + + assert.Equal(6, result) +} + +func TestStream_Reduce(t *testing.T) { + assert := internal.NewAssert(t, "TestStream_Reduce") + + stream := FromSlice([]int{1, 2, 3}) + + result := stream.Reduce(0, func(a, b int) int { + return a + b + }) + + assert.Equal(6, result) +}