Java 剝離方法
1. 概述
在本教程中,我們將探討String
類別中的各種 strip 方法。我們將演示它們的用法並了解在什麼情況下我們應該使用其中一種而不是另一種。最後,我們將這些方法與String
類別的trim()
方法進行比較和對比。
在本文中,我們假設我們有以下String
:
String s = " Baeldung ";
我們可以注意到該String
開頭和結尾處的空格。
2. 剝離法
在 Java 11 中,我們看到了strip()
、 stripLeading()
和stripTrailing()
方法的引入,並在 Java 13 中加入了stripIndent()
方法。此定義是,如果給定字元的等效 Unicode 代碼點對於Character.isWhitespace()
方法傳回true
,則該字元被視為空白。
2.1. strip()
方法
當我們想要從String:
可以使用strip()
方法:
@Test
void givenString_whenUsingStripMethod_thenRemoveTrailingLeadingWhitespace() {
assertThat(s.strip())
.doesNotStartWith(" ")
.doesNotEndWith(" ")
.isEqualTo("Baeldung");
}
因此,我們得到一個只有“ Baeldung
”的新String
,該String
前面或末尾沒有空格。值得理解為什麼我們指定一個“新” String
。這是因為String
類別是不可變的(類別實例的狀態一旦實例化就無法變更)。結果,諸如strip()
方法之類的方法會建立一個新的String
物件並傳回對此物件的引用,該物件反映了所需的狀態。
如果我們的String
只包含空格,那麼strip()
方法將會傳回一個空String:
@Test
void givenWhitespaceString_whenUsingStripMethod_thenObtainEmptyString() {
assertThat(" ".strip()).isEmpty();
}
2.2. stripLeading()
方法
如果我們只想刪除前導空格,也就是String
開頭的空格,我們可以使用stripLeading()
方法:
@Test
void givenString_whenUsingStripLeadingMethod_thenRemoveLeadingWhitespace() {
assertThat(s.stripLeading())
.doesNotStartWith(" ")
.endsWith(" ")
.isEqualTo("Baeldung ");
}
值得注意的是,在我們的斷言中, String
String
結尾仍然有空格。
如果String
僅包含空格,則此方法也會傳回一個空String
:
@Test
void givenWhitespaceString_whenUsingStripLeadingMethod_thenObtainEmptyString() {
assertThat(" ".stripLeading()).isEmpty();
}
2.3. stripTrailing()
方法
如果我們有相反的要求,即僅刪除尾隨空格,則可以使用stripTrailing()
方法:
@Test
void givenString_whenUsingStripTrailingMethod_thenRemoveTrailingWhitespace() {
assertThat(s.stripTrailing())
.startsWith(" ")
.doesNotEndWith(" ")
.isEqualTo(" Baeldung");
}
在我們的斷言中,我們的String
在開頭仍然有空格。
如果我們的String
只有空格,此方法也會傳回一個空String:
@Test
void givenWhitespaceString_whenUsingStripTrailingMethod_thenObtainEmptyString() {
assertThat(" ".stripTrailing()).isEmpty();
}
2.4. stripIndent()
方法
Java 15 引入了對文字塊的支援。文字區塊允許我們實例化一個String
,其值跨多行。
讓我們考慮以下文字區塊:
String textBlock = """
B
a
e
l
d
u
n
g""";
我們可以使用stripIndent()
方法刪除每行中附帶的空格。在我們的例子中,附帶空白是字母「 B
」之前的行上的空白量。每個新行都包含一個額外的空格,這是故意的,因此,使用此方法縮排後,保留其他行的相對位置:
@Test
void givenTextBlockWithExtraSpaceForEachNewLine_whenUsingStripIndent_thenIndentTextBlock() {
String textBlock = """
B
a
e
l
d
u
n
g""";
assertThat(textBlock.stripIndent())
.isEqualTo("B\na\ne\nl\nd\nu\nn\ng");
}
正如我們所看到的,我們得到一個String
,其中第一行不存在空格。此外,其他行透過保留適當的非偶然空白來保持其相對位置。
為了更好地演示線條如何保留其位置性質,我們還考慮以下文字區塊:
@Test
void givenTextBlockWithFourthLineAsLeftMost_whenUsingStripIndent_thenIndentTextBlock() {
String textBlock = """
B
a
e
l
d
u
n
g""";
assertThat(textBlock.stripIndent())
.isEqualTo(" B\na\ne\nl\nd\nu\nn\ng");
}
正如我們所看到的, stripIndent()
方法將帶有String
「 l
」的行完全向左縮進,而其他行保留其相對位置。
3. 比較 Strip 方法與trim()
方法
String
類別有另一個刪除空格的方法,trim()
方法。然而,strip 方法和trim()
方法有一個重要的區別。每個都有其對空白的定義。也就是說, trim()
方法與strip()
方法相似,因為這兩種方法都會刪除前導和尾隨空格。
3.1. trim()
方法
正如我們之前討論的,strip 方法根據字元是否滿足Character.isWhitespace()
方法來定義空白。
但是, trim()
方法將空白定義為代碼點落在 U+0000( null
字元)和 U+0020(空格字元)範圍內的字元。
因此,讓我們考慮一個包含此範圍內的 Unicode 碼點的String
:
@Test
void givenStringWithUnicodeForNull_whenUsingTrimMethod_thenRemoveUnicodeForNull() {
assertThat("Baeldung\u0000".trim()).isEqualTo("Baeldung");
}
我們可以看到,當使用trim()
方法時, null
字元已被視為空白,因此被刪除。
出於示範目的,讓我們考慮一個String
,它的 Unicode 程式碼點超出了trim()
認為空格的範圍:
@Test
void givenStringWithUnicodeForExclamationMark_whenUsingTrimMethod_thenObtainOriginalStringValue() {
assertThat("Baeldung\u0021".trim()).isEqualTo("Baeldung!");
}
感嘆號尚未從我們的String.
值得注意的是我們如何可以互換使用 Unicode 碼點或驚嘆號。
3.2. strip()
方法與trim()
方法
現在,我們知道了trim()方法是如何運作的,讓我們將它與strip()
方法進行比較。讓我們示範一個場景,其中每個方法在使用相同的String
時都會產生不同的結果。
之前,我們發現了trim()
方法如何從String
中刪除null
字符,因為它被認為是空白。但是,對於strip()
方法,根據Character.isWhitespace()
定義, null
不被視為空白:
@Test
void givenStringWithUnicodeForNull_whenUsingStripMethod_thenObtainOriginalStringValue() {
assertThat("Baeldung\u0000".strip()).isEqualTo("Baeldung\u0000");
}
正如我們所看到的,與trim()
方法相比,使用strip()
方法時我們保留了null
Unicode 程式碼點。
4。
在本文中,我們了解了String
類別中可用的不同 strip 方法並示範了它們的用法。此外,我們也發現了 strip 方法和trim()
方法各自如何定義空白。這使我們能夠展示在不同String
上使用這些方法時的細微差別。
與往常一樣,本文中使用的程式碼範例可在 GitHub 上取得。