JavaRush /Java Blog /Random-TW /茶歇#163。lambda 和方法引用有什麼不同。在 Java 中連接 Null 字串的 5 種方法

茶歇#163。lambda 和方法引用有什麼不同。在 Java 中連接 Null 字串的 5 種方法

在 Random-TW 群組發布

lambda 和方法引用有什麼差別

資料來源:Reddit IntelliJ IDEA 建議用方法引用取代 lambda 表達式。它們之間有什麼區別? 茶歇#163。 lambda 和方法引用有什麼不同。 在 Java 中連接 Null 字串的 5 種方法 - 1事實證明,lambda 表達式和方法引用之間存在細微差別。例如,比較:myInstance::getStuff() ->myInstance.getStuff()。一般來說,這兩個選項是等效的。但是,如果 myInstance 為 null,且 lambda 在計算 lambda 時產生空指針,則在嘗試存取參考時將立即產生方法參考。還有什麼?一般來說,如果計算 lambda 表達式的程式碼位於帶有空白指標的 try-catch 內,這一點很重要。例如,我有一個函數mightBeNull(Supplier<T> function),它執行以下操作:
try {
    doStuff(function.get().getSomeMore().getSomeMore());
} catch (NullPointerException e) {
    doOtherStuff();
}
如果呼叫mightBeNull(() -> myNullVariable.getStuff())不會引發異常,那麼「等效」:mightBeNull(myNullVariable::getStuff)將在呼叫函數時立即引發 NullPointerException。這就是差別。 筆記。根據 Stackoverflow 的說法,如果用方法引用替換 lambda,類別字節碼將更加緊湊,這意味著類別將更快地載入到 JVM 中。然而,為了體驗這樣的增益,需要數千個未最佳化的 lambda。然而,在大型專案中,這樣的數字很容易累積。否則,在 lambda 和方法引用之間進行選擇取決於品味和程式碼可讀性。例如,如果 lambda 有幾行,那麼可讀性就會降低,並且只有將 lambda 放置在單獨的方法中並使用對其的引用時,程式碼才會受益。

在 Java 中連接 Null 字串的 5 種方法

來源:Gitconnected 閱讀本文後,您將了解更多在 Java 中使用字串的方法。 Java提供了很多連接字串的方法,但有時當我們不注意空字串時,最終可能會得到null,這顯然不是我們想要的。所以使用我推薦的方法來避免連接字串時出現空值。

問題分析

如果我們想要連接字串數組,我們可以簡單地使用 + 運算子。然而,我們這樣做的時候可能會遇到值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = "";

for (String value : values) {
    result = result + value;
}
結合所有這些元素我們得到這樣的結果:
https://gist.github.comnull
雖然我們發現了問題,但生成的null 值也連接為字串,這顯然不是我們所希望的。即使我們使用 Java 8 或更高版本,使用靜態String.join()方法來連接字串,我們仍然會得到null值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = String.join("", values);
結果是一樣的:
https://gist.github.comnull
那麼如何解決這個問題呢?有幾種解決方案。為了方便後面演示程式碼,我們提取了一個可以傳遞字串並傳回非空字串的方法。
public String nullToString(String value) {
    return value == null ? "" : value;
}

1. String.concat()

String.concat()是String類別自帶的方法。對於字串連接來說非常方便。
for (String value : values) {
    result = result.concat(getNonNullString(value));
}
由於呼叫了nullToString()方法,因此結果中不存在null值。

2.字串產生器

StringBuilder類別提供了許多有用且方便的方法來建構字串。其中最常用的是append()方法,它使用append()來連接字串,並與nullToString()方法結合以避免值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringBuilder result = new StringBuilder();

for (String value : values) {
    result = result.append(nullToString(value));
}
結果,您可以獲得以下結果:
https://gist.github.com

3.StringJoiner類別(Java 8+)

StringJoiner類別提供了更強大的連接字串的功能。它不僅可以指定連接時的分隔符,還可以指定前綴和後綴。在連接字串時,我們可以使用它的add()方法。這裡也將使用nullToString()方法來避免值。
String[] values = {"https", "://", "gist.", "github", ".com", null};
StringJoiner result = new StringJoiner("");

for (String value : values) {
    result = result.add(nullToString(value));
}

4. Streams.filter (Java 8+)

Stream API是Java 8中引入的一個強大的流操作類,可以執行標準的過濾、匹配、遍歷、分組、統計等操作。
  • 過濾器操作過濾器可以接收一個Predicate函數。
  • Predicate函數的介面與前面介紹的Function介面相同。
  • 這是一個函數式介面。
  • 它可以採用泛型參數<T>,傳回值是布林類型。
  • 謂詞常用於過濾資料。
因此,我們可以定義一個謂詞來檢查字串並將其從 Stream API傳遞給filter()方法。此外,您可以使用Collectors.joining()方法來連接剩餘的非空字串。
String[] values = {"https", "://", "gist.", "github", ".com", null};

String result = Arrays.stream(values)
    .filter(Objects::nonNull)
    .collect(Collectors.joining());

5.使用+運算符

使用+運算子也可能解決問題,但不建議這樣做。我們知道String是一個不可變的物件。使用+號往往會建立字串對象,每次都會在記憶體中建立新的字串,所以使用+號連接字串的效能消耗非常高。

結論

本文介紹了幾種連接字串和處理NULL的方法,不同的方法可能適合不同的場景。分析顯示StringBuilder的性能是最好的。但在實際情況下,你需要結合一定的場景,然後選擇效能損失最小的方法。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION