【问题标题】:How does it remove duplicate object and subtract values from an object field with stream?它如何删除重复的对象并从带有流的对象字段中减去值?
【发布时间】:2020-03-16 21:01:16
【问题描述】:

根据带有这些示例值的产品列表

new Product("A", new Stock(5));
new Product("B", new Stock(1));
new Product("A", new Stock(1));

我想过滤重复对象列表以及是否存在重复对象。我在列表中减去它的值。

//list after filter
Product A = 4 stock
        B = 1 stock

是否可以使用流来做到这一点?

【问题讨论】:

  • 如果您的库存数量大于五怎么办?你会做5 - 1 - 9 还是什么?
  • 你能展示Stock类吗?如果计数变为负数会发生什么?
  • 如果减法为负。可以返回零
  • @FelipeMarcelo 您如何确定减法是否为负?股票本身有什么负值(1 - 5 - (-9))?此外,您的尝试在哪里?这将有助于澄清问题。投票结束,因为这需要更多关注。

标签: java collections java-8 java-stream


【解决方案1】:

Collectors.toMap可以和mergeFunction一起使用,在merge函数中可以定义减法的逻辑

    Collection<Product> result = products.stream()
            .collect(Collectors.toMap(Product::getName, Function.identity(), (p1, p2) -> {
                int count = p1.getStock().getValue() - p2.getStock().getValue();
                p1.getStock().setValue(count > 0 ? count : 0);
                return p1;
            })).values();

【讨论】:

  • 非常感谢我的朋友deadpool...在另一种情况下,如果每次重复一个对象,将库存减1,则为int count = p1.getStock()。 getValue() - 1?
  • 谨慎使用这种方法,因为它会修改原始产品的库存
  • 这是正确的@FedericoPeraltaSchaffner,如果他需要,他也可以创建新对象
  • 由于减法不是关联的,这将导致基于处理元素的顺序不同的结果(例如5-1=&gt;41-5=&gt;0)。 (我会推荐@FelipeMarcelo 分享他们尝试过或使用命令式方法的实际实现。)
猜你喜欢
  • 2015-11-06
  • 2021-10-12
  • 1970-01-01
  • 2020-07-22
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2018-04-14
相关资源
最近更新 更多