lambda 和方法引用有什麼差別
資料來源:Reddit IntelliJ IDEA 建議用方法引用取代 lambda 表達式。它們之間有什麼區別? 事實證明,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>,傳回值是布林類型。
- 謂詞常用於過濾資料。
String[] values = {"https", "://", "gist.", "github", ".com", null};
String result = Arrays.stream(values)
.filter(Objects::nonNull)
.collect(Collectors.joining());
GO TO FULL VERSION