java8 stream reduce问题

reduce方法有三个override的方法:

Optional<T> reduce(BinaryOperator<T> accumulator);
T reduce(T identity, BinaryOperator<T> accumulator);
<U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);

想请问一下reduce的返回值是不是必须是List泛型的类型啊?比如能不能把List<ObjectA> objects;
objects.stream.reduce();
返回值必须是ObjectA类型吗?不能是返回一个比如ObjectA的属性相加的值吗?如果ObjectA有一个int类型的字段,我想返回这个字段累计的值

阅读 3.1k
2 个回答

单纯算加法的话,直接mapToInt接一个sum就行了

从题主的问题可以看出来,ObjectA不是stream的最终返回数据,最终返回的数据是ObjectA中的一个属性或者是属性的相关计算结果吧,那这就很符合题主贴的第三个方法嘛,最终返回的类型是泛型U,不是T,这个方法的三个参数代表意思是:

  1. U identity,这个T类型流是空流的时候,返回的默认值
  2. BiFunction<U, ? super T, U> accumulator,一个U和一个T如何转化为一个U
  3. BinaryOperator<U> combiner,两个U是如何合并成一个U

转化为题主这个题目就变成这个样子了(由于这里是基于对象操作,建议题主把ObjectA中的属性改装成包装类Integer)

  1. Integer identity,返回默认的Integer
  2. BiFunction<Integer, ? super ObjectA, Integer> accumulator,一个Integer和一个ObjectA如何转化为一个Integer
  3. BinaryOperator<Integer> combiner,两个Integer是如何合并成一个Integer

结合以前我回答对于reduce方法的理解https://segmentfault.com/q/10...

就可以简单写出这样的代码了

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class ObjectA {

    private Integer score;
}

测试类:

Integer reduce = Arrays.asList(o, o1, o2).stream().reduce(Integer.valueOf(0), ((integer, objectA) -> Integer.sum(integer, objectA.getScore())), Integer::sum);

如果你是需要ObjectA中多个属性进行累加或者其他操作,你可以在第二个参数里修改

Integer reduce = Arrays.asList(o, o1, o2).stream().reduce(Integer.valueOf(0), integer.intValue() + objectA.getScore1().intValue() + objectA.getScore2().intValue()), Integer::sum);

总之都是可以的,不过不太建议直接这么改,建议把业务需要返回的值封装起来,而不是直接在这里改来改去,就直接把objectA.getScore1().intValue() + objectA.getScore2().intValue()封装成一个objectA.getXXX()方法来返回你的计算结果吧,以上仅供参考

推荐问题
宣传栏