Java 11字串API有更新
即將釋出的新LTS JDK 11版本帶來一些有趣的String API更新。
repeat()方法
String API的最酷新增之一是repeat()方法......它允許將String以一定次數與自身連線:
var string =“foo bar”;
var result = string.repeat(2); // foo bar foo bar
如果你嘗試重複一次0次字串,你將總是得到一個空字串:
@Test
void shouldRepeatZeroTimes() {
var string = "foo";
var result = string.repeat(0);
assertThat(result).isEqualTo("");
}
同樣適用於可重複空的字串:
@Test
void shouldRepeatEmpty() {
var string = "";
var result = string.repeat(Integer.MAX_VALUE);
assertThat(result).isEqualTo("");
}
可能很容易認為它只是依賴於底層的StringBuilder,但實際情況並非如此。實際這種實現更具資源效率。
isBlank()
這是非常簡單的 - 現在我們可以檢查String例項是空的還是包含空格(由Character#isWhitespace(int)定義):
var result = " ".isBlank(); // true
strip()
我們現在可以輕鬆地從每個String中刪除所有前導和尾隨空格:
assertThat("f oo".strip()).isEqualTo("f oo");("f oo".strip()).isEqualTo("f oo");
另外,我們可以將操作範圍縮小到尾隨/前導空格:
assertThat("f oo".stripLeading()).isEqualTo("f oo");("f oo".stripLeading()).isEqualTo("f oo");
assertThat("f oo".stripTrailing()).isEqualTo("f oo");("f oo".stripTrailing()).isEqualTo("f oo");
但是,可能會問自己這個與String#trim有何不同?
實際上,String#strip是一種現代的Unicode 識別替代方案,它依賴於與 String#isBlank 相同的對空白的定義。
lines方法
使用這種新方法,我們可以輕鬆地將String例項拆分為單獨行的Stream <String>:
"foo\nbar".lines().forEach(System.out::println);.lines().forEach(System.out::println);
// foo// foo
// bar// bar
真正酷的是,不是拆分String並將其轉換為Stream,而是實現了專門的Spliterators(一個用於拉丁語,另外一個用於UTF-16字串),這使得可以保持惰性。