5

怎么来的?

    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 世界!

我希望附加一个null字符串根本不会附加!
顺便说一句,强制转换String是必要的,因为StringBuilder.append()有很多重载版本。

我简化了我的代码以在这里说明一点,在我的代码中,a 有一个返回字符串的方法

public String getString() { ... }
...
sb.append(getString());
...

getString()有时返回null;现在,如果我想使用 a ,我必须对其进行测试StringBuilder!!!!

此外,让我们在这里澄清我的问题:我怎样才能StringBuilder.append()以一种优雅的方式接受一个空字符串,而不是将其转换为文字字符串“null”。
优雅我的意思是我不想得到字符串,测试它是否是null,然后才附加它。我正在寻找一个优雅的oneliner。

4

10 回答 10

5
How come?

清楚地写在文档中

String 参数的字符按顺序附加,该序列的长度增加了参数的长度。如果 str 为 null,则附加四个字符“null”。

因此,请在追加之前进行空检查。

于 2013-06-26T08:58:48.263 回答
4

就是那样子。null附加为"null". 同样,当您null使用System.out.println(null)print 打印时"null"

避免这种情况的方法是返回字符串getString()检查的方法null

public String getString() {
    ...
    if (result == null) {
        return "";
    }
}
于 2013-06-26T08:59:28.727 回答
2

编辑
之前的回答没有反映 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”,然后进一步处理。

如何让 StringBuilder.append() 以优雅的方式接受空字符串,而不是将其转换为文字字符串“null”。

您需要明确检查给定Stringnull内容,然后继续。例如:

String s = getString();
StringBuffer buf = new StringBuffer();
//Suppose you want "Hello "<value of s>" world"
buf.append("Hello ");
buf.append(s==null?" world" : s+" world");
于 2013-06-26T09:04:45.883 回答
2

它的行为是这样的,因为它不像你想象的那样null是空的。StringString的将是new String("");。基本上,如果将值作为参数获取,则append()方法会附加。"null"null

于 2013-06-26T09:01:26.130 回答
1

AbstractStringBuilder类通过方法附加一个对象,String.valueOf(obj)该方法又将 NULL 转换为字符串文字“null”。因此,这里没有内置的方法可以帮助您。正如其他人建议的那样,您必须在 append 方法中使用三元运算符或编写实用程序方法来处理它。

于 2013-06-26T09:04:37.777 回答
1

这对你有用

public static String getString(StringBuilder sb, String str) {
    return sb.append(str == null ? "" : str).toString();
}
于 2013-06-26T09:05:16.420 回答
0

写一个实用方法怎么样

public static void appendString(StringBuilder sb, String st) {
    sb.append(st == null ? "" : st);
}

或者这个三元运算符非常方便。

于 2013-06-26T08:58:58.967 回答
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());

那里!我在一行中做到了:)

于 2013-06-26T08:59:51.900 回答
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 类。

于 2013-06-26T09:20:47.563 回答
0

一条线?

sb.append((getString()!=null)?getString():"");

完毕。但是没有意义,因为必须调用getString()两次

正如建议的那样,将检查构建到getString()方法中

于 2013-06-26T09:02:09.397 回答