簡體   English   中英

StringBuilder append() 和 null 值

[英]StringBuilder append() and null values

我有一個String列表,我想將它們與它們之間的空格連接起來。 所以我正在使用StringBuilder 現在,如果任何Stringnull ,它們將按字面意義作為“null”存儲在StringBuilder中。 這是一個小程序來說明這個問題:

public static void main(String ss[]) {
    StringBuilder sb = new StringBuilder();

    String s;
    s = null;

    System.out.println(sb.append("Value: ").append(s));
}

我希望 output 為“值:”,但結果為“值:空”

有辦法解決這個問題嗎?

您可以在附加對象之前對其進行檢查:

sb.append("Value: ");
if (s != null) sb.append(s);
System.out.println(sb);

要說明的一個關鍵點是 null 與空字符串不同。 空字符串仍然是一個帶有關聯方法和字段的字符串對象,其中空指針根本不是對象。

來自 StringBuilder 的 append 方法的文檔:

String 參數的字符按順序附加,通過參數的長度增加此序列的長度。 如果 str 為空,則附加四個字符“空”。

鑒於文檔非常清楚,我不確定為什么您希望它是空的:

如果 str 為空,則附加四個字符“空”。

基本上,如果您有空引用,則根本不需要調用 append,或者切換“”的值。

如果您發現自己經常這樣做,您可以編寫一個方法來執行此替換:

public static String nullToEmpty(String text) {
    return text == null ? "" : text;
}

實際上,我剛剛查看了Guava文檔,並且Strings類具有該方法(但使用名為string而不是text的參數)。

您可以使用 commons-lang 的StringUtils#defaultString()

sb.append("Value: ").append(StringUtils.defaultString(myVar));

在 Java 8 中,您還可以使用java.util.Optional類來提供默認值:

System.out.println(sb.append("Value: ").append(Optional.ofNullable(s).orElse("")));

在一行中,您可以執行以下操作:

System.out.println(sb.append("Value: ").append((s==null)?"":s));
import java.util.Objects;
...
sb.append(Objects.toString(s, ""));

使用 Java 內部工具,不需要外部庫。 toString接受字符串,檢查它是否為null ,如果為null ,然后返回指定的默認值,在這種情況下為"" (空字符串),如果它不為null則返回提供的字符串。

出於我的目的,我需要稍微概括一下答案#2。 這是相同的函數,將 Object 作為參數,而不是 String:

private String nullToEmpty(Object obj) {
    return obj == null ? "" : obj.toString();
}

我結合了geeksforgeeks.org和@Benas 的答案。

map = map.entrySet()
    .stream()
    .peek(entry -> entry.setValue(Objects.toString(entry.getValue(), "")))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

來自java.utilsObjects

@Shynthriir 提到的空檢查是解決問題的最簡單最有效的方法(AFAIK)。

但是,我強烈建議將字符串初始化為空字符串String str = ""; 相反,這將為您在更復雜的編程工作中省去很多麻煩。

你可以這樣做:

sb.Replace("= ,", "= null,");

或:

sb.append("Value: ").append((s != null)? s: "NULL");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM