? ? ? ?為了方便我們對(duì)字符串的處理,Guava給我們提供了好多很方便的工具類,接下來(lái)我們對(duì)Guava里面字符串相關(guān)的幫助類做一個(gè)簡(jiǎn)單的介紹卿嘲。
一 連接器 -- Joiner
? ? ? ?Joiner用于幫助我們把多個(gè)字符串通過(guò)連接符連接起來(lái)卖哎。Joiner里面也提供和很多很有用的方法,比如null提花债鸡,跳過(guò)null值等等。而且還派生了MapJoiner類用于連接多個(gè)Map铛纬,可以同時(shí)制定Map之間的連接符和key value之間的連接符厌均。
1.1 Joiner方法介紹
public class Joiner {
/**
* 創(chuàng)建連接器 Joiner
* @param separator 連接符
*/
public static Joiner on(String separator);
/**
* 創(chuàng)建連接器 Joiner
* @param separator 連接符
*/
public static Joiner on(char separator);
/**
* 相當(dāng)于parts中間添加appendable
* StringBuffer也是一個(gè)Appendable
*/
@CanIgnoreReturnValue
public <A extends Appendable> A appendTo(A appendable, Iterable<?> parts) throws IOException;
/**
* 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加appendable
* StringBuffer也是一個(gè)Appendable
*/
@CanIgnoreReturnValue
public <A extends Appendable> A appendTo(A appendable, Iterator<?> parts) throws IOException;
/**
* 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加appendable
* StringBuffer也是一個(gè)Appendable
*/
@CanIgnoreReturnValue
public final <A extends Appendable> A appendTo(A appendable, Object[] parts) throws IOException;
/**
* 把元素轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加appendable
*/
@CanIgnoreReturnValue
public final <A extends Appendable> A appendTo(
A appendable, @Nullable Object first, @Nullable Object second, Object... rest)
throws IOException;
/**
* 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
*/
@CanIgnoreReturnValue
public final StringBuilder appendTo(StringBuilder builder, Iterable<?> parts);
/**
* 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
*/
@CanIgnoreReturnValue
public final StringBuilder appendTo(StringBuilder builder, Iterator<?> parts);
/**
* 相當(dāng)于parts中的每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
*/
@CanIgnoreReturnValue
public final StringBuilder appendTo(StringBuilder builder, Object[] parts);
/**
* 相當(dāng)于每個(gè)元素都轉(zhuǎn)換為String,然后在每個(gè)元素的中間添加builder.toString()
*/
@CanIgnoreReturnValue
public final StringBuilder appendTo(
StringBuilder builder, @Nullable Object first, @Nullable Object second, Object... rest);
/**
* 把parts每個(gè)元素轉(zhuǎn)換為字符串,再添加連接符之后返回
*/
public final String join(Iterable<?> parts);
/**
* 把parts每個(gè)元素轉(zhuǎn)換為字符串告唆,再添加連接符之后返回
*/
public final String join(Iterator<?> parts);
/**
* 把parts每個(gè)元素轉(zhuǎn)換為字符串棺弊,再添加連接符之后返回
*/
public final String join(Object[] parts);
/**
* 給參數(shù)里面的每個(gè)元素轉(zhuǎn)換為String,再添加連接符之后返回
*/
public final String join(@Nullable Object first, @Nullable Object second, Object... rest);
/**
* 用指定的字符串替換掉null對(duì)象
*/
public Joiner useForNull(final String nullText);
/**
* 連接Map的Joiner 設(shè)置key, value之間的分隔符
*/
public MapJoiner withKeyValueSeparator(char keyValueSeparator);
/**
* 連接Map的Joiner 設(shè)置key, value之間的分隔符
*/
public MapJoiner withKeyValueSeparator(String keyValueSeparator);
}
1.2 Joiner使用實(shí)例
@Test
public void joinTest() {
List<String> stringSrc = Lists.newArrayList("C", "Android", "Java");
String resultString = Joiner.on("; ")
.join(stringSrc);
System.out.println(resultString);
}
/**
* useForNull 用指定的值來(lái)替換null
*/
@Test
public void useForNullTest() {
String resultString = Joiner.on("; ")
.useForNull("abc")
.join("C", null, "Android", "Java");
System.out.println(resultString);
}
/**
* skipNulls 跳過(guò)null
*/
@Test
public void skipNullsTest() {
String resultString = Joiner.on("; ")
.skipNulls()
.join("C", null, "Android", "Java");
System.out.println(resultString);
}
/**
* withKeyValueSeparator
*/
@Test
public void withKeyValueSeparatorTest() {
Map<String, String> mapSrc = new HashMap<>();
mapSrc.put("key0", "value0");
mapSrc.put("key1", "value1");
String resultString = Joiner.on("; ")
.withKeyValueSeparator("&")
.join(mapSrc);
System.out.println(resultString);
}
二 拆分器 -- Splitter
? ? ? ?Splitter可以幫助我們制定拆分符對(duì)字符串進(jìn)行拆分晶密。里面也提供了很多使用的方法,比如去掉空格模她,限制拆分出來(lái)的字符串的個(gè)數(shù)等等稻艰。同時(shí)還提供了MapSplitter派生類用來(lái)把指定格式的字符串拆分到Map里面去。
2.1 Splitter方法介紹
public class Splitter {
/**
* 指定按單個(gè)字符拆分
*/
public static Splitter on(char separator);
/**
* 指定按字符匹配器拆分
*/
public static Splitter on(final CharMatcher separatorMatcher);
/**
* 指定按字符串拆分
*/
public static Splitter on(final String separator);
/**
* 指定按正則表達(dá)式拆分
*/
@GwtIncompatible // java.util.regex
public static Splitter on(Pattern separatorPattern);
/**
* 指定按正則表達(dá)式拆分
*/
@GwtIncompatible // java.util.regex
public static Splitter onPattern(String separatorPattern);
/**
* 創(chuàng)建Splitter對(duì)象, 按固定長(zhǎng)度拆分侈净;最后一段可能比給定長(zhǎng)度短尊勿,但不會(huì)為空
*/
public static Splitter fixedLength(final int length);
/**
* 從結(jié)果中自動(dòng)忽略空字符串
*/
public Splitter omitEmptyStrings();
/**
* 限制拆分出的字符串?dāng)?shù)量
*/
public Splitter limit(int limit) {
checkArgument(limit > 0, "must be greater than zero: %s", limit);
return new Splitter(strategy, omitEmptyStrings, trimmer, limit);
}
/**
* 移除結(jié)果字符串的前導(dǎo)空白和尾部空白
*/
public Splitter trimResults() {
return trimResults(CharMatcher.whitespace());
}
/**
* 給定匹配器,移除結(jié)果字符串的前導(dǎo)匹配字符和尾部匹配字符
*/
// TODO(kevinb): throw if a trimmer was already specified!
public Splitter trimResults(CharMatcher trimmer);
/**
* 按照趙鼎的拆分條件拆分, 返回Iterable<String>
*/
public Iterable<String> split(final CharSequence sequence);
/**
* 按照指定的條件拆分畜侦,返回List<String>
*/
public List<String> splitToList(CharSequence sequence);
/**
* 返回MapSplitter并且指定key,value之間的拆分字符串
*/
@Beta
public MapSplitter withKeyValueSeparator(String separator);
/**
* 返回MapSplitter并且指定key,value之間的拆分字符串
*/
@Beta
public MapSplitter withKeyValueSeparator(char separator);
/**
* 返回MapSplitter并且指定key,value之間的拆分規(guī)則為Splitter
*/
@Beta
public MapSplitter withKeyValueSeparator(Splitter keyValueSplitter);
2.2 Splitter使用實(shí)例
@Test
public void splitTest() {
Iterable<String> iterableList = Splitter.on(',').trimResults() // 移除前面和后面的空白
.omitEmptyStrings() // 去掉null
.split("foo,bar,, qux");
List<String> resultList = Lists.newArrayList(iterableList);
for (String item : resultList) {
System.out.println(item);
}
}
/**
* splitToList 最終直接返回List
*/
@Test
public void splitToListTest() {
List<String> resultList = Splitter.on(',').trimResults().omitEmptyStrings().splitToList("foo,bar,, qux");
for (String item : resultList) {
System.out.println(item);
}
}
/**
* MapSplitter
*/
@Test
public void mapSplitterTest() {
String source = "key0:value0#key1:value1";
Map<String, String> resultMap = Splitter.on("#").withKeyValueSeparator(":").split(source);
for (Map.Entry<String, String> entry : resultMap.entrySet()) {
System.out.println("key: " + entry.getKey() + " value: " + entry.getValue());
}
}
三 字符匹配器 -- CharMatcher
? ? ? ?CharMatcher是字符匹配的一個(gè)幫助類元扔,CharMatcher主要圍繞兩件事情來(lái)進(jìn)行:找到匹配的字符、處理匹配的字符夏伊。
3.1 CharMatcher方法介紹
CharMatcher創(chuàng)建的static方法 | 解釋 | 備注 |
---|---|---|
CharMatcher any() | 返回匹配任何字符的Matcher | |
CharMatcher none() | 返回不匹配所有字符的Matcher | |
CharMatcher whitespace() | 返回匹配所有空白字符的Matcher | |
CharMatcher breakingWhitespace() | 返回匹配所有可換行的空白字符(不包括非換行空白字符,例如"\u00a0")的Matcher | |
CharMatcher ascii() | 返回匹配是否是ASCII字符的Matcher | |
CharMatcher digit() | 返回匹配ASCII數(shù)字的Matcher | 不推薦使用了摇展,使用inRange('0', '9')替換 |
CharMatcher javaDigit() | 返回匹配UNICODE數(shù)字的Matcher | 不推薦使用了,使用inRange('0', '9')替換實(shí)現(xiàn) |
CharMatcher javaLetter() | 返回匹配字母的Matcher | 不推薦使用了溺忧,使用 inRange('a', 'z').or(inRange('A', 'Z') 替換 |
CharMatcher javaLetterOrDigit() | 返回匹配數(shù)字或字母的Matcher | 不推薦使用了咏连,使用isLetterOrDigit替換 |
CharMatcher javaUpperCase() | 返回匹配大寫的Matcher | 不推薦使用了,使用isUpperCase()替換 |
CharMatcher javaLowerCase() | 返回匹配小寫的Matcher | 不推薦使用了鲁森,使用isLowerCase()替換 |
CharMatcher javaIsoControl() | 返回匹配ISO控制字符的Matcher, 使用 Charater.isISOControl() 實(shí)現(xiàn) | 也可以使用isISOControl()實(shí)現(xiàn) |
CharMatcher invisible() | 返回匹配所有看不見(jiàn)的字符的Matcher | 不推薦使用了 |
CharMatcher singleWidth() | 返回匹配單字寬字符的Matcher祟滴,如中文字就是雙字寬 | 不推薦使用了 |
CharMatcher is(char match) | 返回匹配指定字符的Matcher | |
CharMatcher isNot(char match) | 返回不匹配指定字符的Matcher | |
CharMatcher anyOf(CharSequence sequence) | 返回匹配sequence中任意字符的Matcher | |
CharMatcher noneOf(CharSequence sequence) | 返回不匹配sequence中任何一個(gè)字符的Matcher | |
CharMatcher inRange(char startInclusive, char endIncludesive) | 返回匹配范圍內(nèi)任意字符的Matcher | |
CharMatcher forPredicate(Predicate<? super Charater> predicate) | 返回使用predicate的apply()判斷匹配的Matcher | |
CharMatcher negate() | 返回以當(dāng)前Matcher判斷規(guī)則相反的Matcher | |
CharMatcher and(CharMatcher other) | 返回與other匹配條件組合做與來(lái)判斷的Matcher | |
CharMatcher or(CharMatcher other) | 返回與other匹配條件組合做或來(lái)判斷的Matcher |
CharMatcher常用方法 | 解釋 |
---|---|
boolean matchesAnyOf(CharSequence sequence) | 只要sequence中有任意字符能匹配Matcher,返回true |
boolean matchesAllOf(CharSequence sequence) | sequence中所有字符都能匹配Matcher,返回true |
boolean matchesNoneOf(CharSequence sequence) | sequence中所有字符都不能匹配Matcher,返回true |
int indexIn(CharSequence sequence) | 返回sequence中匹配到的第一個(gè)字符的坐標(biāo) |
int indexIn(CharSequence sequence, int start) | 返回從start開(kāi)始,在sequence中匹配到的第一個(gè)字符的坐標(biāo) |
int lastIndexIn(CharSequence sequence) | 返回sequence中最后一次匹配到的字符的坐標(biāo) |
int countIn(CharSequence sequence) | 返回sequence中匹配到的字符計(jì)數(shù) |
String removeFrom(CharSequence sequence) | 刪除sequence中匹配到到的字符并返回 |
String retainFrom(CharSequence sequence) | 保留sequence中匹配到的字符并返回 |
String replaceFrom(CharSequence sequence, char replacement) | 替換sequence中匹配到的字符并返回 |
String trimFrom(CharSequence sequence) | 刪除首尾匹配到的字符并返回 |
String trimLeadingFrom(CharSequence sequence) | 刪除首部匹配到的字符 |
String trimTrailingFrom(CharSequence sequence) | 刪除尾部匹配到的字符 |
String collapseFrom(CharSequence sequence, char replacement) | 將匹配到的組(連續(xù)匹配的字符)替換成replacement |
String trimAndCollapseFrom(CharSequence sequence, char replacement) | 先trim在replace |
3.2 CharMatcher使用實(shí)例
? ? ? ?針對(duì)CharMatcher的使用,我們舉幾個(gè)簡(jiǎn)單的例子歌溉。
@Test
public void matcherNumCharTest() {
// 創(chuàng)建一個(gè)匹配數(shù)字字符的CharMatcher
CharMatcher numMatcher = CharMatcher.inRange('0', '9');
// 匹配判斷(false)
System.out.println(numMatcher.matches('a'));
}
@Test
public void retainFromTest() {
// 創(chuàng)建一個(gè)匹配數(shù)字字符的CharMatcher
CharMatcher numMatcher = CharMatcher.inRange('0', '9');
// retainFrom保留匹配到的字符(123789)
System.out.println(numMatcher.retainFrom("123abc789"));
}
@Test
public void countInTest() {
// 創(chuàng)建匹配任何字符的Matcher
CharMatcher numMatcher = CharMatcher.any();
// 返回sequence中匹配到的字符個(gè)數(shù)(9個(gè))
int matcherCount = numMatcher.countIn("abc123abc");
System.out.println("匹配到的字符個(gè)數(shù):" + matcherCount);
}
@Test
public void negateTest() {
// 創(chuàng)建了一個(gè)匹配字母的Matcher
CharMatcher letterMatcher = CharMatcher.inRange('a', 'z')
.or(CharMatcher.inRange('A', 'Z'));
// 非字母的Matcher negate()規(guī)則相反
CharMatcher notLetterMatcher = letterMatcher.negate();
System.out.println(notLetterMatcher.retainFrom("abcABC123"));
}
@Test
public void indexInTest() {
// 創(chuàng)建了一個(gè)只匹配a字母的Matcher
CharMatcher letterMatcher = CharMatcher.is('a');
// 非字母的Matcher negate()規(guī)則相反
int aStartIndex = letterMatcher.indexIn("123abcabc");
int aEndIndex = letterMatcher.lastIndexIn("123abcabc");
System.out.println("a第一次出現(xiàn)的位置:" + aStartIndex);
System.out.println("a最后一次出現(xiàn)的位置:" + aEndIndex);
}
四 字符集 -- Charsets
? ? ? ?guava里面的Charsets可以完全使用StandardCharsets來(lái)代替垄懂。所以我們干脆直接介紹StandardCharsets了,StandardCharsets比較是JDK里面的東西痛垛。StandardCharsets是用來(lái)做字符集處理草慧。比如我們String和byte數(shù)組之間相互轉(zhuǎn)換的時(shí)候可以使用到。
String src = "abc";
byte[] byteDis src.getBytes(StandardCharsets.UTF_8);
? ? ? ?StandardCharsets里面的代碼也很簡(jiǎn)答匙头。
public final class StandardCharsets {
private StandardCharsets() {
throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");
}
/**
* Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
* Unicode character set
*/
public static final Charset US_ASCII = Charset.forName("US-ASCII");
/**
* ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1
*/
public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
/**
* Eight-bit UCS Transformation Format
*/
public static final Charset UTF_8 = Charset.forName("UTF-8");
/**
* Sixteen-bit UCS Transformation Format, big-endian byte order
*/
public static final Charset UTF_16BE = Charset.forName("UTF-16BE");
/**
* Sixteen-bit UCS Transformation Format, little-endian byte order
*/
public static final Charset UTF_16LE = Charset.forName("UTF-16LE");
/**
* Sixteen-bit UCS Transformation Format, byte order identified by an
* optional byte-order mark
*/
public static final Charset UTF_16 = Charset.forName("UTF-16");
}
五 CaseFormat
? ? ? ?CaseFormat是一個(gè)枚舉漫谷,他也是一種字符轉(zhuǎn)換實(shí)用工具類,以提供不同的ASCII字符格式之間的轉(zhuǎn)換蹂析。比如我們想把lower-hyphen字符轉(zhuǎn)換成lowerCamel舔示,小駝峰大駝峰之間的轉(zhuǎn)換等等。
CaseFormat枚舉 | 對(duì)應(yīng)字符串格式 | 解釋 |
---|---|---|
LOWER_HYPHEN | lower-hyphen | 全部小寫—連接 |
LOWER_UNDERSCORE | lower_underscore | 全部小寫下劃線連接 |
LOWER_CAMEL | lowerCamel | 小駝峰 |
UPPER_CAMEL | UpperCamel | 大駝峰 |
UPPER_UNDERSCORE | UPPER_UNDERSCORE | 全部大寫下劃線連接 |
? ? ? ?CaseFormat類的用法也很簡(jiǎn)單电抚。里面就一個(gè)方法惕稻,public final String to(CaseFormat format, String str) 用于把一種CaseFormat類型對(duì)應(yīng)的字符串轉(zhuǎn)換成另一種CaseFormat對(duì)應(yīng)的字符串。
? ? ? ?舉一個(gè)非常簡(jiǎn)單的例子蝙叛。把字符串“CONSTANT_NAME”轉(zhuǎn)換為小駝峰形式“constantName”俺祠。 代碼如下
@Test
public void test() {
// 把字符串“CONSTANT_NAME”轉(zhuǎn)換成"constantName"
String resultToStr = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME");
System.out.println(resultToStr);
}
? ? ? ?這里關(guān)于Guava字符串處理者幾個(gè)幫助類的源碼我們沒(méi)怎么講。里面實(shí)現(xiàn)其實(shí)不難的。強(qiáng)烈建議大家有時(shí)間的時(shí)候看一去瞧下蜘渣。