使用适当的键组合结构并创建一个映射器函数-然后将其提供给groupingBy
下游的summingInt
流收集器,并根据收集的数据重新创建Item
对象的列表
我将使用Lombok在下面展示示例,但是基本上我的意思是使用正确的ItemKey
/ HashCode
实现创建不可变的Equals
类,并在Item
中添加构造函数类,用于根据Item
和计算的数量重新创建ItemKey
对象(这可以通过另一种方式实现,例如使用某种工厂方法)
@Data
@AllArgsConstructor
class Item {
private String name;
private double code;
private int quantity;
private String expDate;
public Item(ItemKey key,int quantity) {
this.name = key.getName();
this.code = key.getCode();
this.expDate = key.getExpDate();
this.quantity = quantity;
}
}
@Value
class ItemKey {
private String name;
private double code;
private String expDate;
}
// ...
Function<Item,ItemKey> compositeKey = item -> new ItemKey(item.getName(),item.getCode(),item.getExpDate());
List<Item> filteredAndQuantityAggregated = itemsNeed.stream()
.collect(Collectors.groupingBy(compositeKey,Collectors.summingInt(Item::getQuantity)))
.entrySet()
.stream()
.map(entry -> new Item(entry.getKey(),entry.getValue()))
.collect(Collectors.toList());
,
再次使用流的groupingBy
功能,没有龙目岛和某些样式差异的方法。
映射看起来像这样
List<Item> items = new ArrayList<>();
Map<ItemGroupKey,Integer> grouped = items.stream()
.collect(Collectors.groupingBy(ItemGroupKey::new,summingInt(Item::getQuantity)));
List<Item> dedupedSummed = grouped.entrySet().stream()
.map(t -> t.getKey().getItem().forQuantity(t.getValue()))
.collect(Collectors.toList());
,但是您需要先设置好一种机制,然后机器才能运行,ItemGroupKey
会在名称,代码和expirationDate相等时指出两个项目相等。请注意,您还必须添加适当的hashCode()
实现。我选择使用Item.forQuantity
方法来创建具有特定数量集的项目的副本。
class ItemGroupKey{
private final Item item;
ItemGroupKey(Item item) {
this.item = item;
}
public Item getItem() {
return item;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ItemGroupKey other = (ItemGroupKey) o;
return Double.compare(other.getItem().getCode(),item.getCode()) == 0 &&
Objects.equals(other.getItem().getName(),item.getName()) &&
Objects.equals(other.getItem().getExpDate(),item.getExpDate());
}
@Override
public int hashCode() {
return Objects.hash(item.getCode(),item.getName(),item.getExpDate());
}
}
class Item {
private final String name;
private final double code;
private final int quantity;
private final String expDate;
Item(String name,double code,int quantity,String expDate) {
this.name = name;
this.code = code;
this.quantity = quantity;
this.expDate = expDate;
}
public Item forQuantity(int quantity){
return new Item(name,code,quantity,expDate);
}
public String getName() {
return name;
}
public double getCode() {
return code;
}
public int getQuantity() {
return quantity;
}
public String getExpDate() {
return expDate;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
return Double.compare(item.code,code) == 0 &&
quantity == item.quantity &&
Objects.equals(name,item.name) &&
Objects.equals(expDate,item.expDate);
}
@Override
public int hashCode() {
return Objects.hash(name,expDate);
}
}
本文链接:https://www.f2er.com/3150165.html