用Java将列表中的项目分组 [英] Group items in a list in Java
问题描述
我有一个对象列表List<WorkingActivityModel> mList = new ArrayList<>();
public class WorkingActivityModel {
private String name;
private Sales sales;
private Shifts shifts;
}
销售模式为:
public class Sales {
private int product1;
private int product2;
}
Shifts模型是:
The Shifts model is:
public class Shifts {
private int shift1;
private int shift2;
}
如何按名称对List<WorkingActivity> mList
中的项目进行分组,然后对相应的销售额和班次求和?因此,如果我在列表中有2个同名商品,则将它们分组并汇总其销售额和班次?
How can I group items in List<WorkingActivity> mList
by name and then sum corresponding sales and shifts? So if I have 2 items in the list with the same name then group them and sum its sales and shifts?
我尝试了流式传输,但没有成功:
I have tried stream but with no success:
List<WorkingActivityModel> result = mList.stream()
.collect(groupingBy(WorkingActivityModel::getName, LinkedHashMap::new, toList()))
.values().stream()
.flatMap(Collection::stream)
.collect(toList());
另一个选择是:
List<WorkingActivity> mList = new ArrayList<>();
HashMap<String, List<WorkingActivityModel>> map = new HashMap<>();
for(WorkingActivityModel o : mList){
if (!map.containsKey(o.getKey())) {
List<WorkingActivityModel> list = new ArrayList<>();
list.add(o);
map.put(o.getKey(), list);
} else {
map.get(o.getKey()).add(o);
}
}
在这种情况下,我不知道如何将相应的销售额和班次加起来
In this case, I don't know how to sum corresponding sales and Shifts
修改
下面是预期结果的示例:
below an example of the expected result:
推荐答案
您可以使用定义的自定义合并操作来做到这一点,从而使toMap
的执行变得稍微容易一些.
You can do that using a custom merge operation defined such that performing toMap
becomes slightly easier.
Collection<WorkingActivityModel> result = mList.stream()
.collect(Collectors.toMap(WorkingActivityModel::getName, Function.identity(),
(a, b) -> WorkingActivityModel.mergeModels(a, b))) // WorkingActivityModel::mergeModels
.values();
mergeModels
是我在WorkingActivityModel
类中定义的静态方法,例如它处理了合并两个相似命名的模型的逻辑.
The mergeModels
is a static method that I have defined within WorkingActivityModel
class such as it deals with the logic of merging two similarly named models.
static WorkingActivityModel mergeModels(WorkingActivityModel model1, WorkingActivityModel model2) {
return new WorkingActivityModel(model1.name,
Sales.mergeSales(model1.sales, model2.sales),
Shifts.mergeShifts(model1.shifts, model2.shifts));
}
当然,mergeSales
和mergeShifts
遵循相同的模式,实现起来很简单.
Of course, the mergeSales
and mergeShifts
follow the same pattern and are trivial to implement.
这篇关于用Java将列表中的项目分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!