Simple reduce on an empty array will throw:
Exception in thread "main" java.lang.UnsupportedOperationException: Empty iterable can't be reduced.
The same exception when chaining:
val a = intArrayOf()
val b = a.reduce({ memo, next -> memo + next }) // -> throws an exception
val a1 = intArrayOf(1, 2, 3)
val b1 = a.filter({ a -> a < 0 }).reduce({ a, b -> a + b }) // -> throws an exception
Is it the expected operation of the reduce or is it a bug?
Are there any workarounds?
The exception is correct, reduce
does not work on an empty iterable or array. What you're probably looking for is fold
, which takes a starting value and an operation which is applied successively for each element of the iterable. reduce
takes the first element as a starting value, so it needs no additional value to be passed as an argument, but requires the collection to be not empty.
Example usage of fold
:
println(intArrayOf().fold(0) { a, b -> a + b }) // prints "0"