面試題
在之前的內(nèi)容中我們介紹了字符串。同時,也介紹了字符串的拼接操作,并且分析了幾種字符串拼接方式的原理。其實在JAVA8中還提供了一種新的字符串操作方式。就是今天我們要來深入討論的stringJoiner。
import java.util.StringJoiner;public class Test {public static void main(String[] args) {StringJoiner joiner;
與其他的字符串操作不同的是,這個類的包是來自于java.util.StringJoiner,通過IDEA分析可以看到在這個類中提供了如下的一些方法操作。根據(jù)慣例來自于java.util包下的內(nèi)容一般可以理解為一個工具類。這也就是為什么這個類與其他字符串類型不同的原因。
用法講解
首先我們先來創(chuàng)建一個測試類,通過測試類的操作來講解這個StringJoiner的用法,代碼如下。
public class Test {public static void main(String[] args) {StringJoiner stringJoiner = new StringJoiner("Hello");stringJoiner.add("World");stringJoiner.add("架構師面試");System.out.println(stringJoiner.toString());StringJoiner stringJoiner1 = new StringJoiner(":","[","]");stringJoiner1.add("Hello").add("World").add("字符串操作");System.out.println(stringJoiner1.toString());
運行結果如下
結合上面的內(nèi)容,可以知道,在StringJoiner類中提供了兩個構造函數(shù),有5個公有的方法,而其中使用最多的方法就是add方法和toString方法。下面我們就來看看add方法的實現(xiàn)原理。
add原理
add()方法源碼如下
public StringJoiner add(CharSequence newElement) {prepareBuilder().Append(newElement);return this;private StringBuilder prepareBuilder() {if (value != null) {value.append(delimiter);} else {value = new StringBuilder().append(prefix);return value;
會看到這里使用的也是StringBuilder來進行字符串操作。分析源碼可以知道,其實使用StringJoiner和直接使用StringBuilder是一樣的。那么為什么還要多此一舉地實現(xiàn)開發(fā)這樣一個類操作呢?
StringJoiner分析
如果在實際開發(fā)中遇到這樣一個操作,我們要將一個數(shù)組中的所有對象拼接成一個大的字符串對象,那么我們應該如何去操作呢?
結合之前的分析,我們可以循環(huán)數(shù)組對象,并且使用StringBuilder進行拼接。
StringBuilder builder = new StringBuilder();if (!list.isEmpty()) {builder.append(list.get(0));for (int i = 1, n = list.size(); i < n; i++) {builder.append(",").append(list.get(i));builder.toString();
當然我們還可以使用Java8中提供lambda表達式來進行操作。代碼如下。其實操作和循環(huán)操作實現(xiàn)的方式是一樣的。
list.stream().reduce(new StringBuilder(), (sb, s) -> sb.append(s).append(','), StringBuilder::append).toString();
還可以使用我們最不推薦的方式在循環(huán)中使用+的方式來進行拼接。
這些操作都可以完成上面的內(nèi)容,但是由于涉及到循環(huán),所以說整體的效率都不是太高。
為了提升操作效率StringJoiner類就出現(xiàn)了。首先我們來分析一個類Collectors,java.util.stream.Collectors實現(xiàn)各種有用的縮減操作的Collector的實現(xiàn),例如將元素累積到集合中,根據(jù)各種標準匯總元素等。通過這個類中的joining()方法代碼如下。
public static Collector joining() {return new CollectorImpl(StringBuilder::new, StringBuilder::append,(r1, r2) -> { r1.append(r2); return r1; },StringBuilder::toString, CH_NOID);public static Collector joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix) {return new CollectorImpl<>(() -> new StringJoiner(delimiter, prefix, suffix),StringJoiner::add, StringJoiner::merge,StringJoiner::toString, CH_NOID);
將這個方法與stream()方法進行結合,也就是在Java8中提供的一些高級用法。
list.stream().collect(Collectors.joining(":"))
會發(fā)現(xiàn)在joining()方法中不但使用了StringBuilder還使用了StringJoiner。最終的效果都是實現(xiàn)高效。
總結
這篇文章主要介紹了Java8中對于字符串操作的一些高級用法,但是盡管是高級用法也只是以提升開發(fā)效率為目的,這些高級用法都可以使用基本用法來代替,只是在日常的開發(fā)中為了提升開發(fā)效率。我們會采用一些高級用法,但是想要理解這些高級用法還要基礎知識做支持,希望大家多多關注,后續(xù)會為大家?guī)砀嗟母韶泝?nèi)容。