guava的splitter.java位于package com.google.common.base。 拆分字符串本来是一件比较复杂的事情,但是有了这个包里的这个工具,就方便很多了,他远比String.split()强大太多了,下面我们简单认识下
SplitToList : 返回的是一个字符串的List, 示例代码如下:
import java.util.List; import com.google.common.base.Splitter; public class Program { public static void main(String[] args) { String value = "cup,tea,coffee"; // Use Splitter, on method, and splitToList. // ... Separates String on comma. List<String> list = Splitter.on(',').splitToList(value); for (String element : list) { System.out.println(element); } } }
输出为:
cup tea coffee 如果你想用ArrayList,可以把他传给ArrayList的构造函数:
ArrayList<String> result = new ArrayList<>(list);
需要注意的是:split.on()里的参数,既可以是一个字符,也可以是String,还可以是CharMatcher这个类,如代码所示:
import java.util.List; import com.google.common.base.CharMatcher; import com.google.common.base.Splitter; public class Program { public static void main(String[] args) { String values = "hey, how\nare you\tdoing my friend?"; // Split on whitespace with CharMatcher class. List<String> results = Splitter.on(CharMatcher.WHITESPACE) .omitEmptyStrings().splitToList(values); for (String value : results) { System.out.println(value); } } }
输出为:
hey, how are you doing my friend? CharMatcher 可选的值,可以参考这个类。 特殊的是,还可以CharMatcher.anyOf(",;:")这么来指定参数,可以将"one,two:three;four"分成one,two,threee,four. 你还可以指定一个范围:CharMatcher.inRange('0', '3')来把"cat 0 dog 4 1 fish"拆成:cat dog 4 fish。TrimResults 这个函数从名字就能看出来,能够去除拆分后的结果的首尾的空格。
import com.google.common.base.Splitter; public class Program { public static void main(String[] args) { String value = "rock ,stone, bird, fish"; // Split on comma, and trim our results. // ... Use split, which returns an Iterable. Iterable<String> result = Splitter.on(',').trimResults().split(value); for (String v : result) { System.out.println(v); } } }
以上代码的输出是:
rock stone bird fish
结果前后的空格被去掉了。OmitEmptyStrings 则可以帮助你去掉不需要的空元素,如果没有调用他会把空元素也返回给你,这个是区别于String.split的地方:
import java.util.List; import com.google.common.base.Splitter; public class Program { public static void main(String[] args) { String values = "cat,,dog,,,fish"; // Omit empty Strings when splitting. List<String> list = Splitter.on(',').omitEmptyStrings() .splitToList(values); System.out.println(list.toString()); } }
输出为:
[cat, dog, fish]
你以为这就够了吗?显然不是。对于复杂类型,他还能直接将他拆成map结构,看下面的例子:
import java.util.Map; import java.util.Map.Entry; import com.google.common.base.Splitter; public class Program { public static void main(String[] args) { // This String contains key-value pairs. String value = "cat=Fluffy,dog=Spot,bird=Chirpy"; // Use Splitter to parse key-value separators. Map<String, String> map = Splitter.on(',').withKeyValueSeparator('=') .split(value); // Loop over entries. for (Entry<String, String> entry : map.entrySet()) { System.out.println("[" + entry.getKey() + "] " + entry.getValue()); } } }
正如你所预料的,输出结果为:
[cat] Fluffy
[dog] Spot
[bird] Chirpy
需要特别注意的是,这个对格式是严格校验的。
"cat=,dog=Spot,bird=Chirpy" 输出是:
[cat] (空字符) [dog] Spot [bird] Chirpy "cat,dog=Spot,bird=Chirpy" 你以为上面的字符串会正确的分割成
[dog] Spot [bird] Chirpy 事实上不是,这个时候会抛一个异常,Chunk is not a valid entry,并且返回的是个null。 所以如果你的字符是用户输入的则需要捕获这个异常,以防止各种输入的可能错误,程序更改如下,事实上,文中的程序永远都不存在,哪有这种构造的已知的字符串呢?
import java.util.Map; import java.util.Map.Entry; import com.google.common.base.Splitter; public class Program { private static Logger logger = LoggerFactory.getLogger(BabyCarHelper.class); public static void main(String[] args) { // This String contains key-value pairs. String value = args[0]; //"cat=Fluffy,dog=Spot,bird=Chirpy"; // Use Splitter to parse key-value separators. try { Map<String, String> map = Splitter.on(',').withKeyValueSeparator('=') .split(value); } catch(Exception e) { logger.warn('params is not valid' + value); } // Loop over entries. for (Entry<String, String> entry : map.entrySet()) { System.out.println("[" + entry.getKey() + "] " + entry.getValue()); } } }
所以,其实以上这些才是本文的重点,所有的格式一旦有一点不满足,整个表达式都会解析失败,一个都得不到。例如:
"cat,dog=Spot,bird=Chirpy"
"cat=dog=Spot,bird=Chirpy" "cat=Fluffy,dog,Spot,bird=Chirpy" 而
"cat=,dog=Spot,bird=Chirpy" 则是没问题的,只是他的value是空,你可以试试 "=Fluffy,dog=Spot,bird=Chirpy"是个什么结果。 ps: 再附送一点知识,如果你的map想转成HashMap也非常简单,你只需这样,
HashMap<String, String> hash = new HashMap<>(map);