JoinerGuava Joiner顾名思义就是将字符串连接起来
Joiner joiner = Joiner.on("; ").skipNulls();System.out.println(joiner.join("Harry", null, "Ron", "Hermione"));//可以传集合、数组或多个参数List<Integer> nums = List.of(1, 2, 3, 4, 5);System.out.println(joiner.join(nums));
输出:
Harry; Ron; Hermione1; 2; 3; 4; 5
上面代码中忽略了 null 也可以将 null 替换为其他字符串,比如:
System.out.println(Joiner.on("; ").useForNull("**").join(1,2,3,null));
Joiner 是线程安全的,一般你可以定义一个 static final的常量:
static final Joiner joiner = Joiner.on(",");
还可以将 map 也 join 起来:
Joiner.MapJoiner mapJoiner = Joiner.on("; ").withKeyValueSeparator("|");Map<String, Integer> testMap = Map.of("a", 1, "b", 2);System.out.println(mapJoiner.join(testMap));
输出:
b|2; a|1
其他 JoinerJDK 自身也有 String 的 Joiner API:
String PREFIX = "[";String SUFFIX = "]";StringJoiner jdkJoiner = new StringJoiner(",");StringJoiner jdkJoiner2 = new StringJoiner(",", PREFIX, SUFFIX);System.out.println(jdkJoiner2.add("a").add("b").add("c").toString());
可以添加前、后缀,但元素只能一个一个 add,没有 guava 方便。
如果你是简单的 join 需求,使用 JDK8 以后的 API,直接用 Stream 就完了 。
//use JAVA8 streamList<String> rgbList = Arrays.asList("Red", "Green", "Blue");String commaSeparatedRGB = rgbList.stream().map(color -> color.toString()).collect(Collectors.joining(","));System.out.println(commaSeparatedRGB);
总结简单 join 直接 stream 流式一行代码搞定,特殊点的看看 Guava 的 joiner 支不支持,一般 Guava 的 Joiner 够用了 。再搞不定的自己写个工具类方法吧 。
SplitterJDK 内建【跟着 Guava 学 Java 之字符串处理】JDK 内建的字符串拆分工具有一些古怪的特性 。比如,String.split悄悄丢弃了尾部的分隔符 。
System.out.println(Arrays.toString(",a,,b,".split(",")));//输出 [, a, , b]
当然还有 StringTokenizer 这种更繁琐的东西:
String str = "runoob,google,taobao,facebook,zhihu";// 以 , 号为分隔符来分隔字符串StringTokenizer st=new StringTokenizer(str,",");while(st.hasMoreTokens()) {System.out.println(st.nextToken());}
Guava SplitterSplitter使用令人放心的、直白的流畅 API 模式对这些混乱的特性作了完全的掌控 。
Iterable<String> split = Splitter.on(',').trimResults().omitEmptyStrings().split("foo,bar,,qux");System.out.println(split.toString());//输出 [foo, bar, qux]
Splitter 可以被设置为按照任何 Pattern, char, String, 或者 CharMatcher拆分 。
方法 描述 范例 Splitter.on(char) 按单个字符拆分 Splitter.on(';') Splitter.on(CharMatcher) 按字符匹配器拆分 Splitter.on(CharMatcher.anyOf(";,.")) Splitter.on(String) 按字符串拆分 Splitter.on(",") Splitter.on(Pattern) Splitter.onPattern(String) 按正则表达式拆分 Splitter.onPattern("r?n") Splitter.fixedLength(int) 按固定长度拆分;最后一段可能比给定长度短,但不会为空 。 Splitter.fixedLength(3)
列举一些 Splitter 的方法
方法 描述 omitEmptyStrings() 从结果中自动忽略空字符串 trimResults() 移除结果字符串的前导空白和尾部空白 trimResults(CharMatcher) 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符 limit(int) 限制拆分出的字符串数量
注意 trimResults(CharMatcher) ,它是把所有前导字符干掉外加尾部能匹配上的字符,举个例子:
// 可以看到,前缀都没了,尾部与 “_” 匹配上的只有 “c__”,所以干掉了一个 “_”,剩下 “c_”System.out.println(Splitter.on(',').trimResults(CharMatcher.is('_')).split("_a ,_b_ ,c__").toString());
上面的代码返回 :[a , b_ , c] ,
同 Joiner 一样,Splitter实例也是线程安全的,所以可以定义为 static final
static finalSplittersplitter = Splitter.on(",").omitEmptyStrings().trimResults();
还可以利用 MapSplitter 把字符串反序列化成 Map,例如:
@Testpublic void testMapSplitter() {String startSring = "Washington D.C=Redskins#New York City=Giants#Philadelphia=Eagles#Dallas=Cowboys";Map<String, String> testMap = Maps.newLinkedHashMap();testMap.put("Washington D.C", "Redskins");testMap.put("New York City", "Giants");testMap.put("Philadelphia", "Eagles");testMap.put("Dallas", "Cowboys");Splitter.MapSplitter mapSplitter = Splitter.on("#").withKeyValueSeparator("=");Map<String, String> splitMap = mapSplitter.split(startSring);assertEquals(testMap, splitMap);}
推荐阅读
- 一文学会AOP动态切面开发
- 大神都在用的Word文档技巧,你们快来学!
- 茶碱过敏症状
- 夏季如何预防湿疹,学会四个好方法
- 求职|90后大学毕业生找工作被拒,知道被拒绝原因后,网友:长见识了
- 大学|毕业10年不找工作,33岁还在家啃老,却理直气壮:这全怪我爸妈
- 学做曲奇饼干
- 教师|中学招聘教师要求学历清北本科,看到学校名字后,网友:明白了
- 大学生|面试时被问及过往薪资,如实回答可能要吃亏,聪明人这样说
- 杭州|初中一语文老师的辞职信走红,教学19年工资2000多,校长无言以对