怎么回事?
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append((String)null);
sb.append(" World!");
Log.d("Test", sb.toString());
可生产
06-25 18:24:24.354:D / Test(20740): Hellonull World!
我希望追加null
字符串根本不会附加!!
顺便说一下,转换为String
是必要的,因为StringBuilder.append()
有很多重载版本。
我简化了我的代码,在这里提出了一个观点,在我的代码中有一个方法返回一个字符串
public String getString() { ... }
...
sb.append(getString());
...
getString()
有时会返回null
;现在我必须测试它,如果我想使用StringBuilder
!!!!
此外,让我们在这里澄清我的问题:如何让StringBuilder.append()
以优雅的方式接受空字符串,而不是将其转换为文字字符串“null”。
优雅我的意思是我不想得到字符串,测试它是null
然后才附加它。我正在寻找一个优雅的oneliner。
答案 0 :(得分:5)
How come?
按顺序附加String参数的字符,按参数的长度增加此序列的长度。如果str为null,则附加四个字符“null”。
所以请在追加之前进行空检查。
答案 1 :(得分:4)
就是这样。 null
附加为"null"
。同样,当您使用null
打印System.out.println(null)
时,您会打印"null"
。
避免这种情况的方法是返回字符串getString()
的方法检查null
:
public String getString() {
...
if (result == null) {
return "";
}
}
答案 2 :(得分:2)
它的行为与此类似,因为null
不是您想象的空String
。空String
将为new String("");
。基本上append()
方法会在"null"
值作为参数时附加null
。
答案 3 :(得分:2)
修改强>
我的previous answer没有反映出OP提出的StringBuilder这种行为的正当理由。感谢@Stephen C指出
我希望附加一个空字符串根本不会附加!!
但它正在追加。 StringBuilder
这种行为的原因隐藏在append(Object obj)
方法的实现细节中,该方法将我们带到AbstractStringBuilder#append(String str)
方法,该方法定义如下:
public AbstractStringBuilder append(String str) {
if (str == null) str = "null"; -->(1)
//.......
return this;
}
它明确指出如果输入String
为null,则将其更改为String literal“null”,然后进一步处理。
如何让StringBuilder.append()以优雅的方式接受空字符串,而不是将其转换为文字字符串“null”。
您需要明确检查String
的{{1}},然后继续。例如:
null
答案 4 :(得分:1)
AbstractStringBuilder
类通过String.valueOf(obj)
方法追加一个对象,该方法又将NULL转换为字符串文字“null”。因此,没有内置的方法来帮助你。您必须在append方法中使用三元运算符或者编写实用程序方法来处理它,正如其他人所建议的那样。
答案 5 :(得分:1)
这对你有用
public static String getString(StringBuilder sb, String str) {
return sb.append(str == null ? "" : str).toString();
}
答案 6 :(得分:0)
如何编写像
这样的实用方法public static void appendString(StringBuilder sb, String st) {
sb.append(st == null ? "" : st);
}
或者这个三元运算符非常方便。
答案 7 :(得分:0)
String nullString = null;
StringBuilder sb = new StringBuilder();
sb.append("Hello");
if (nullString != null) sb.append(nullString);
sb.append(" World!");
Log.d("Test", sb.toString());
有!我在一行中做到了:)
答案 8 :(得分:0)
一行?
sb.append((getString()!=null)?getString():"");
完成。但是,无需拨打getString()
两次
建议检查getString()
方法
答案 9 :(得分:0)
您还可以为StringBuilder编写装饰器,它可以检查您想要的任何内容:
class NotNullStringBuilderDecorator {
private StringBuilder builder;
public NotNullStringBuilderDecorator() {
this.builder = new StringBuilder();
}
public NotNullStringBuilderDecorator append(CharSequence charSequence) {
if (charSequence != null) {
builder.append(charSequence);
}
return this;
}
public NotNullStringBuilderDecorator append(char c) {
builder.append(c);
return this;
}
//Other methods if you want
@Override
public String toString() {
return builder.toString();
}
}
使用示例:
NotNullStringBuilderDecorator sb = new NotNullStringBuilderDecorator();
sb.append("Hello");
sb.append((String) null);
sb.append(" World!");
System.out.println(sb.toString());
使用此解决方案,您无需更改POJO类。