当将模型列表从(例如)Thing映射到MyModel时,这是我们代码库中的常见模式:
List<MyModel> myModelList = new ArrayList<>();
for (Thing thing : things) {
MyModel myModel = new MyModel(thing.getId());
if (myModelList.contains(myModel)) {
myModel = myModelList.get(myModelList.indexOf(myModel));
} else {
myModel.setName(thing.getName());
myModelList.add(myModel);
}
myModel.setSomeQuantity(myModel.getSomeQuantity() + thing.getSomeQuantity());
}
(假设MyModel具有使用id来确定相等性的equals()和hashCode())
这可以通过几种不同的方式完成,您可以使用ID为键的地图等。我们可以为其创建通用的帮助器类,该类可在任何地方使用。
但是我想知道的是,是否在某些java,apache,spring,google或其他库中已经存在某种有效且干净的方法来帮助所有此类的帮助器类或其他类型的构造?
您同时使用contains
和indexOf
上一个List
。两者通常都需要线性搜索,因此应尽可能避免。绝对不应该那样indexOf
直接使用contains
。您永远不需要这样做
if (list.contains(x))
x = list.get(list.indexOf(x));
因为你总是可以这样做
int index = list.indexOf(x);
if (index >= 0)
x = list.get(index);
这是更多代码,但避免搜索列表两次。
但是,我不喜欢您的使用equals
和hashCode
。通常,equal
对象可以互换使用,而在您的情况下,的两个版本myModel
是不相同的。仅列表中已有的一个携带有关名称和总量的额外信息。
我建议用只包含两个字段(和)MyModel
的不可变类代替。然后,您可以执行此操作(假设您使用的是Java 8)MyModel
id
name
Map<MyModel, Double> quantities = new HashMap<>();
for (Thing thing : things)
quantities.merge(thing.getModel(), thing.getQuantity(), Double::sum);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句