我有一个连接一组字符串的函数,如下所示:
StringBuffer sb = new StringBuffer();
sb.append(fct1());
sb.append(fct2());
sb.append(fct3());
其中fct1(),fct2()和fct3()应该返回一个String。 问题是我必须像这样测试返回的值:
sb.append(fct1() == null ? "" : fct1());
因为如果值为null,我会收到异常。
问题是我有很多这样的指令,最重要的是,我无法修改这些返回字符串的函数(fct1,fct2和fct3)。
是否有解决方案可以自动“清理”我的字符串?
谢谢。
PS:我创建了一个可以做到的功能:
public String testNullity(String aString){
aString == null ? "" : aString;
}
所以我可以这样称呼它:
sb.append(testNullity(fct1));
sb.append(testNullity(fct2));
...
答案 0 :(得分:4)
另一种选择可能是
public class SafeStringBuilder {
private StringBuilder builder = new StringBuilder();
public SafeStringBuilder append(String s) {
if (s != null)
builder.append(s);
return this;
}
}
答案 1 :(得分:1)
如果您不介意引入依赖关系,请使用Guava的Joiner
代替StringBuffer
:
Joiner j = Joiner.on("").skipNulls();
StringBuilder sb = new StringBuilder();
j.appendTo(sb, fct1());
j.appendTo(sb, fct2());
j.appendTo(sb, fct3());
String result = sb.toString();
// or even just
Joiner j = Joiner.on("").skipNulls();
String result = j.join(fct1(), fct2(), fct3());
N.B。通常,除非您需要StringBuffer
的线程安全性,否则应使用StringBuilder
。相同的API,更好的性能。
答案 2 :(得分:0)
除了缩短方法名称之外,没有任何其他方法可以使此解决方案更简单。 (可能有使用面向方面编程的解决方案,但总的来说我并不认为这更简单。)
答案 3 :(得分:0)
不幸的是,使用testNullity()
的解决方案是Java可以获得的最佳解决方案(尽管考虑更好的命名)。事实上,已经有一种方法可以做到:StringUtils.html#defaultString。
答案 4 :(得分:0)
您可以围绕StringBuffer
:
class MyStringBuffer {
StringBuffer _sb = new StringBuffer();
public boolean append(String s) {
_sb.append(s==null ? "" : s);
return s == null;
}
public String toString() { return _sb.toString(); }
}
答案 5 :(得分:0)
标准API中没有这样的功能,虽然有些方法(做其他事情)内置了它。
例如,System.getProperty()有一个采用默认值的变体,如果它找不到给定的属性,它将不会返回null
,而是返回给定的默认值。您可能会考虑为fct*
方法提供这样一个“默认”参数,如果它有效。
我认为C#有一个??
运算符可以满足您的需求(您可以调用sb.append(fct2() ?? "")
),但我认为Java不会很快添加任何新的运算符。
检查功能的一个更好的变体是:
public void appendIfNotNull(StringBuffer sb, String s) {
if(s != null) {
sb.append(s);
}
}
如果没有要追加的内容,这可以避免使用空字符串进行多余的追加调用。