当前位置: 首页 > 知识库问答 >
问题:

有条件地添加多个值的Java流

宇文修筠
2023-03-14
class Sale {
   String country;
   BigDecimal amount;
}
country | amount
nl      | 9
nl      | -3
be      | 7.9
be      | -7

是否有一种方法可以使用单个流来实现映射 >

用两个独立的流很容易做到这一点,但我不能只用一个。

共有1个答案

蔺敏达
2023-03-14

它应该使用collectors.tomap和合并函数来求和对。

假设是不可变的,并且只有第一个和第二个元素的getter,代码可能如下所示:

static Map<String, Pair<BigDecimal, BigDecimal>> sumUp(List<Sale> list) {
    return list.stream()
               .collect(Collectors.toMap(
                   Sale::getCountry,
                   sale -> sale.getAmount().signum() >= 0 
                       ? new Pair<>(sale.getAmount(), BigDecimal.ZERO)
                       : new Pair<>(BigDecimal.ZERO, sale.getAmount()),
                   (pair1, pair2) -> new Pair<>(
                       pair1.getFirst().add(pair2.getFirst()),
                       pair1.getSecond().add(pair2.getSecond())
                   )
                   // , LinkedHashMap::new // optional parameter to keep insertion order
               ));
}

测试

List<Sale> list = Arrays.asList(
    new Sale("us", new BigDecimal(100)),
    new Sale("uk", new BigDecimal(-10)),
    new Sale("us", new BigDecimal(-50)),
    new Sale("us", new BigDecimal(200)),
    new Sale("uk", new BigDecimal(333)),
    new Sale("uk", new BigDecimal(-70))
);

Map<String, Pair<BigDecimal, BigDecimal>> map = sumUp(list);

map.forEach((country, pair) -> 
    System.out.printf("%-4s|%s%n%-4s|%s%n", 
        country, pair.getFirst(), country, pair.getSecond()
));
uk  |333
uk  |-80
us  |300
us  |-50
 类似资料:
  • 正如这篇stackoverflow文章中所述,在调用终端操作之前,不会实际应用筛选器。既然我在调用终端操作之前重新分配了stream的值,那么上面的代码是否仍然是使用Java8流的适当方法呢?

  • 我有以下一段代码: 有没有一种很好的方法可以有条件地添加元素,比如使用流操作?我只想在列表为空时添加method2中的元素,否则返回,以此类推。 编辑:值得一提的是,这些方法包含繁重的逻辑,因此需要防止执行。

  • 我有一个数据集 是否有任何方法可以确保,如果不同的的下一个值小于中的值,那么它应该在 列中执行加法。 下面是我期待的结果 所以基本上我寻求一个解决方案,对于每个唯一的< code>field_pointpath,如果它遇到一个小于前一个值的值,那么它应该将前一个值与下一个值相加。 if <代码>值[i 1]

  • 问题内容: 如果满足特定条件,是否有办法仅向React组件添加属性? 我应该在渲染后基于Ajax调用将required和readOnly属性添加到表单元素中,但是由于readOnly =“ false”与完全省略该属性不同,因此我看不到如何解决此问题。 下面的示例应解释我想要的内容,但将无法正常工作(解析错误:意外的标识符)。 问题答案: 显然,对于某些属性,如果您传递给它的值不真实,React足

  • 问题内容: 是否可以根据条件向标签添加内容?像在此示例中一样,当我只想在第一次迭代中添加时(仅用于的第一个元素)? 问题答案: 是的,在这种情况下,AngularJS具有两个指令: 可以使用ng-show / ng-hide指令族基于评估表达式的结果来隐藏(通过使用显示CSS规则)DOM 3的一部分。 如果我们想有条件地物理删除/添加DOM的一部分,那么ng-switch指令家族(ng-switc

  • 问题内容: 我正在尝试使用指令根据某个属性的值将属性添加到指令。不幸的是,这对我不起作用。我设置了一个简单的示例来演示正在发生的事情。 柱塞示例 问题答案: 编辑 在阅读了Angular Repo中提到的GitHubIssue之后,我终于明白了。 您需要使用更高的指令设置一个属性,并将其属性设置为true(在编译我们的指令后,跳过所有其他指令的编译)。然后在函数中,我们将编译整个元素本身。但是在此