简单地减少空数组将抛出:
线程"main"中的异常java.lang.UnsupportedOperationException:无法减少空的iterable.
链接时相同的异常:
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
Run Code Online (Sandbox Code Playgroud)
它是减少的预期操作还是一个bug?
有没有解决方法?
Ale*_*lov 49
异常是正确的,reduce不适用于空的iterable或数组.您可能正在寻找的是fold,它采用了一个起始值和一个连续应用于迭代的每个元素的操作.reduce将第一个元素作为起始值,因此不需要将其他值作为参数传递,但要求集合不为空.
用法示例fold:
println(intArrayOf().fold(0) { a, b -> a + b }) // prints "0"
Run Code Online (Sandbox Code Playgroud)
小智 11
我只想为无法使用fold(...). 因为,为了使用fold你需要能够表达一些初始值。
someIterable
.filter{ TODO("possibly filter-out everything") }
.takeIf{ it.isNotEmpty() }
?.reduce{ acc, element -> TODO("merge operation") }
?: TODO("value or exception for empty")
Run Code Online (Sandbox Code Playgroud)
使用这种方法,如果集合为空,reduce则不会执行,因为takeIf会将其转换为null. 在这种情况下,最后我们可以使用 elvis 运算符来表达一些值(或抛出异常)。
你的例子:
intArrayOf(1, 2, 3)
.filter({ a -> a < 0 })
.takeIf{ it.isNotEmpty() }
?.reduce({ a, b -> a + b })
?: 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6665 次 |
| 最近记录: |