Collectors.java中reducing方法为何可使用数组索引?
为什么Collectors.reducing里用数组索引?
核心原因是解决lambda表达式中无法修改外部不可变变量的限制,具体拆解为以下几点:
- Collector的累加器函数(你提到的那段lambda)需要一个可变容器来存储中间累加结果。但如果直接用
U类型的变量(比如Integer这类不可变类),lambda里没法直接修改它的值——因为lambda要求引用的外部变量是final或等效final的,不能重新赋值。 - 用数组(比如
U[])作为容器就能绕开这个限制:数组本身是引用类型对象,只要数组引用不被重新赋值(满足等效final要求),我们就可以自由修改数组内的元素(也就是a[0]),以此更新中间累加结果。 - 代码里的
boxSupplier(identity)作用就是把传入的identity包装成单元素数组,比如new U[]{identity},让后续的累加器、组合器都能通过数组索引操作这个可变的中间值。 - 最后
a -> a[0]这个finisher函数,就是把数组里的最终结果取出,返回给调用者。
举个直白的例子:如果U是Integer,直接用int sum的话,lambda里没法给sum重新赋值,但用int[] sumArr = {0},就能通过sumArr[0] += ...来更新数值,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Toni26
相关产品推荐
相关产品推荐

