我有一个超过90个属性的域对象。在所有这些属性中都有.
,我想用空字符串替换它。
我现在可以做:
for (int i = 0; i < list.size(); i++) {
list.get(i).getProp1().replace(".", "");
list.get(i).getProp2().replace(".", "");
//yadadada ...
list.get(i).getProp90().replace(".", "");
}
然而,这非常无聊并需要编写大量代码。有没有办法更优雅,更快地做到这一点?
感谢您的想法
答案 0 :(得分:2)
如何在您的Domain类中创建方法updateProp(因为这就是您所需要的):
public void updateProp(int index) {
prop[index] = prop[index].replace(".", "");
}
然后在循环中调用它
for (int i = 0; i < list.size(); i++) {
for(int j=0; j < prop.length; j++) { /*use a getter, instance or class
reference for obtaining prop.length*/
list.get(i).updateProp(j);
}
}
将Prop保存在自己的Object中也可以解决问题,但我想它会破坏更多的代码而不是修复它。
答案 1 :(得分:1)
你必须使用java反射:
Method[] methods = DomainObject.class.getDeclaredMethods();
for (Method method : methods) {
if (method.getName().startsWith("getProp")) {
String result = (String) method.invoke(object, new Object[0]);
result = result.replace(".", "");
Method setter = DomainObject.class.getMethod(method.getName()
.replace("get", "set"), String.class);
setter.invoke(object, result);
}
}
另外不要忘记String是不可变的,replace方法不会改变它,调用只返回更改后的版本。
答案 2 :(得分:1)
如果您无法修改对象(可能是自动生成的或其他内容),您可以通过反思来实现目标:
for(MyObject a: list){
Field[] fields = MyObject.class.getDeclaredFields();
for (Field f : fields) {
try {
if (f.get(a) instanceof String) {
String str = ((String) f.get(a)).replace(".", "");
f.set(a, str);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
如果您不想修改对象的值,可以创建The Monster:
List<Map<String, String>> monster = new ArrayList<Map<String, String>>();
for(MyObject a: list){
Field[] fields = MyObject.class.getDeclaredFields();
Map<String, String> map = new HashMap<String, String>();
for (Field f : fields) {
try {
if (f.get(a) instanceof String) {
String str = ((String) f.get(a)).replace(".", "");
map.put(f.getName(), str);
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
monster.add(map);
}
现在,您可以通过反射创建一个美丽的地图列表。您可以通过
访问第一个对象的prop1String obj1prop1 = monster.get(0).get("prop1"); //Value of prop1 for first object in list.
答案 3 :(得分:1)
您建议您拥有一个Java类,该类具有多达90个属性,且数据字段的格式始终不正确。这个问题可能是X-Y Problem
使用.
存储属性的原因,以及没有.
通过更好地了解这些原因及其背景,可以呈现更清洁的解决方案。
例如,是否仅仅为了显示目的而移除.
?也许在输出点考虑一个通用函数来去除.
的
或许这可能是数据捕获过程中的某种行为副作用,在这种情况下,这需要成为输入过滤器的一部分。
或者这是一次性的ETL例行程序吗?在这种情况下,也许可以通过一些通用SQL或grep / sed脚本直接在数据列上完成。
答案 4 :(得分:0)
我想对我来说最好的方法是在你的Object中创建一个方法(列表中的方法),在这个方法中,你可以像在这里一样直接更改所有属性。比你打电话给你的方法,而不是所有这些。 治疗将直接在您的对象上;)
for (int i = 0; i < list.size(); i++) {
list.set(i,list.get(i).update());
}
在你的对象中:
public void update()
{
prop1 = prop1.replace(".","");
etc for all the properties
}
如果您的属性是公开的,也可以使用Field[] getFields()
之类的内容。
但实际上,我认为你应该在创建对象时进行替换,因此在将其添加到列表中之前。会更好。