Cof*_*anz 1 java string performance stringbuilder concatenation
我收到型号清单。模型的数量可能很大。该模型具有许多特性,其中任何一个都可能为空。
我需要基于其属性为每个模型构建一个字符串。如果property == null,则将一些静态部分添加到结果字符串中,例如“ property1为null”。
如果else 属性== null,则添加类似以下内容:“ property1 =='valueOfThePropertyHere'”。
结果字符串应如下所示:
prop1 == 'value1' and prop2 is null and prop3 == 'value3' and prop4 == 'value4' and prop5 is null and ..... propN == 'valueN'
然后从列表中为每个模型生成这样的字符串。
显然,我在for循环中执行此操作,为此我使用了StringBuilder。关键是在StringBuilder的append方法中,我使用三元运算符检查模型的每个字段是否为null,并基于此将检查结果添加到结果字符串中。但是,如果属性不为null,则需要添加一些静态部分+字段本身的值+一些更多静态内容。这意味着我需要为我拥有的每个属性再添加一个StringBuilder。或者我可以使用“ +”,无论如何它将被转换成StringBuilder,据我所知,在StringBuilder中使用“ +”是一个不好的做法(但是我仍然必须使用它)。
例:
List<Model> models = repository.getModels();
for (Model m: models) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder
.append(m.getField1() == null ? "field1 is null" : "field1 == '" + new StringBuiler().append(m.getField1()).append("'").append(" and ").toString()))
.append(m.getField2() == null ? "field2 is null" : "field2 == '" + new StringBuiler().append(m.getField2()).append("'").append(" and ").toString()))
...............
.append(m.getFieldN() == null ? "fieldN is null" : "fieldN == '" + new StringBuiler().append(m.getFieldN()).append("'").append(" and ").toString()));
System.out.println(stringBuilder.toString());
}
Run Code Online (Sandbox Code Playgroud)
从性能的角度来看,它看起来不太好,因为对于模型列表中的每个模型,我都在堆中创建了另一堆StringBuilder对象,只是为了获取结果字符串。
我想念什么吗?从性能角度来看,有更好的方法吗?还是没关系,因为我暂时没有其他选择。
简单吧。
代替
stringBuilder
.append(m.getField1() == null ? "field1 is null" : "field1 == '" + new StringBuiler().append(m.getField1()).append("'").append(" and ").toString()))
Run Code Online (Sandbox Code Playgroud)
使用:
if (m.getField1() == null) {
stringBuilder.append("field1 is null");
} else {
stringBuilder.append("field1 == '").append(m.getField1()).append("'").append(" and ");
}
Run Code Online (Sandbox Code Playgroud)
除了StringBuilder在StringBuilder.append调用中使用内部调用的独特之处(以及为什么不直接使用+...)之外,解析:条件表达式中的位置真的很困难。将其分成几行要容易得多。
如果发现自己不得不重复很多这种代码模式,请定义一个方法:
void append(StringBuilder stringBuilder, String name, Object value) {
stringBuilder.append(name);
if (value == null) {
stringBuilder.append(" is null");
} else {
stringBuilder.append(" == '").append(value).append("'").append(" and ");
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样调用:
append(stringBuilder, "field1", m.getField1());
append(stringBuilder, "field2", m.getField2());
append(stringBuilder, "field3", m.getField3());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |