使用 Java 8 进行链接简化的最佳方式

2022-09-01 01:44:35

我有以下代码,我正在尝试改进:

BigDecimal total = entity.getAssociate().stream().map(Associates::getPropertyA)
    .reduce(BigDecimal.ZERO, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyB)
    .reduce(total, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyC)
    .reduce(total, BigDecimal::add);
total = entity.getAssociate().stream().map(Associates::getPropertyD)
    .reduce(total, BigDecimal::add);

它有效,但真的感觉有更好的方法来做到这一点。任何人都可以在这个问题上启发我吗?


答案 1

如果所有这些属性都属于同一类型(似乎它们都是),您可以使用来创建其中的单个属性,然后将其转换为总和:BigDecimalflatMapStreamreduce

BigDecimal total = 
    entity.getAssociate()
          .stream()
          .flatMap (a -> Stream.of(a.getPropertyA(),a.getPropertyB(),a.getPropertyC(),a.getPropertyD()))
          .reduce(BigDecimal.ZERO, BigDecimal::add);

答案 2

您可以简单地在map内链接添加所有属性:

BigDecimal total = entity.getAssociate().stream()
            .map(a -> a.getPropertyA()
                    .add(a.getPropertyB())
                    .add(a.getPropertyC())
                    .add(a.getPropertyD()))
            .reduce(BigDecimal.ZERO, BigDecimal::add);

请注意,这会更改数字的添加顺序。


推荐