我有这种类型的代码:
HashMap out = new HashMap();
if(!StringUtils.isEmpty(foo.a)) {
out.put(A.A_NAME, foo.a);
}
if(!StringUtils.isEmpty(foo.b)) {
out.put(B.B_NAME, foo.b);
}
if(!StringUtils.isEmpty(foo.c)) {
out.put(C.C_NAME, foo.c);
}
//... many continues here
是否有更快的方式来编写所有这些代码?
答案 0 :(得分:3)
有更快的方法吗?
在表现方面,没有。 (或者至少......改进的范围可能不值得打扰。)
就代码行和可读性而言,您可以通过编写和使用如下方法来重构代码:
private void addIfNonempty(HashMap map, String name, String value) {
if (!StringUtils.isEmpty(value)) {
map.put(name, value);
}
}
addIfNonempty(out, A.A_NAME, foo.a);
addIfNonempty(out, B.B_NAME, foo.b);
// etcetera
您也可以使用反射来实现这一点。根据用于标识要“添加”的字段的标准,这可以减少(或消除)重复的代码。但性能可能一个数量级更慢,而代码可能脆弱;例如如果添加或删除字段......或者“模式”被破坏。
是否有更快的方式来编写所有这些代码?
这实际上取决于“重复性”的确切细节......以及您的IDE /编辑技能。例如,如果您的IDE支持emacs键盘宏之类的东西,您可以从字段名称有效地生成源代码。如果你擅长它,你可以用更少的时间来编写和测试反射版本。
答案 1 :(得分:2)
如果字段不是static
,那么你可以这样做:
Test t= new Test();
for (Field field : t.getClass().getDeclaredFields()) {
if (field.getType().equals(String.class) && !((String)field.get(t)).isEmpty()) {
System.out.println(field.get(t));
}
}
否则,如果他们static
使用null
而不是t
:
field.get(null)