Java流,如何GROUP BY并查找流的乘积

标签 java hashmap java-stream bigdecimal

我有一个流,可以获取流中每个余额的“每日返回”,但我想获取每个 accountId 的所有每日返回的乘积。我知道我需要添加类似的内容:

.collect(Collectors.groupingBy(n -> n.getAccountId(), Collectors.reducing(BigDecimal.ZERO, BigDecimal::multiply)));

但是我不知道如何。这是到目前为止的流:

Map<Long, Double> solution = new HashMap<Long, Double>();

balances.stream()
          .forEach(n -> {
              if(n.getCashflow().compareTo(BigDecimal.ZERO) > 0) {
                  solution.put(n.getAccountId(), n.getEndingBalance().divide((n.getStartingBalance().add(n.getCashflow())), 6, RoundingMode.FLOOR).doubleValue());
              }
              else {
                  solution.put(n.getAccountId(), (n.getEndingBalance().subtract(n.getCashflow())).divide(n.getStartingBalance(), 6, RoundingMode.FLOOR).doubleValue());
              }
              });

请随时提出任何实现此解决方案的方法,谢谢!

最佳答案

为了更容易理解,我们将每日 yield 的计算与流分开:

Function<Balance, BigDecimal> dailyReturn = n -> {
    if (...) {  
        return ...;
    } else {
        return ...;
    }
};   // or use a ternary statement

现在我们可以使用 3 参数 toMap 收集器收集每个帐户的所有每日 yield 的乘积:

balances.stream().collect(Collectors.toMap(
    Balance::getAccountId, 
    dailyReturn, 
    BigDecimal::multiply
));

关于Java流,如何GROUP BY并查找流的乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328338/

相关文章:

java - 在仍在使用时使用迭代器从 ArrayList 中删除内容

java - 在 JScrollPane 中滚动 JComponent

java - 如何使用 Eclipse Mars 在部署描述符中定义 servlet?

java - 将非 Maven 项目转换为 Maven

Java 8 流 .min() 和 .max() : why does this compile?

java - 链接 HashMap 按值查找键?

java - HashMap 中一个类的多个对象

java - 如果添加现有数据,Java 中的 HashMap 内存使用情况是什么

java - 如何拆分字符串流并生成字符串数组列表?

Java 8 使用多个键进行分组