2

我有这种类型的代码:

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

有没有更快的方法来编写所有这些代码?

4

2 回答 2

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 键盘宏之类的东西,您可以有效地从字段名称生成源代码。如果你擅长它,你可能会在比编写和测试反射版本更短的时间内做到这一点。

于 2013-06-28T16:13:14.133 回答
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)
于 2013-06-28T16:10:17.993 回答