gpt4 book ai didi

java - 在java中组织对象列表

转载 作者:搜寻专家 更新时间:2023-11-01 01:15:37 27 4
gpt4 key购买 nike

我有课

public class ProductStock {

private Long id;
private Integer quantity;

}

和像

这样的列表
List<ProductStock> productStocks = 
{
ProductStock(1, 1),
ProductStock(2, 1),
ProductStock(3, 1),
ProductStock(1, 1),
ProductStock(4, 1),
ProductStock(5, 1),
ProductStock(2, 1)
}

我想按 id 对 productStocks 进行分组。像下面这样转换此列表的最佳方法是什么

productStocks = 
{
ProductStock(1, 2),
ProductStock(2, 2),
ProductStock(3, 1),
ProductStock(4, 1),
ProductStock(5, 1)
}

最佳答案

对于 Java8 流,您可以这样尝试:

productStocks = new ArrayList<>( productStocks.stream().collect( 
Collectors.toMap( p -> p.id, p -> p, (p,o) -> { p.quantity += o.quantity; return p;} ) )
.values() );

这是做什么的:

  • productStocks.stream().collect( Collectors.toMap(...) ) 为列表创建流并将值收集到映射中。
  • p -> p.id 使用产品的 id 作为映射键
  • p -> p 使用产品作为映射值,如果它不存在的话
  • (p,o) -> { p.quantity += o.quantity; return p;} 通过将数量添加到 p 中并返回来合并现有产品 p 和"new"产品值 o那。或者,您可以创建一个新的 Product 实例:(p,o) -> new Product(p.id, p.quantity + o.quantity)
  • 最后,我们根据 map 的值构建了一个新列表

请注意,将元素收集到类似的映射中可能不会保留元素的顺序。如果您想保持源列表中定义的顺序,您可以向 collect(...) 添加第四个参数:LinkedHashMap::new

关于java - 在java中组织对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com