原文地址 :http://blog.csdn.net/ac_dao_di/article/details/53750028
github : https://github.com/google/guava
Maven:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>24.0-jre</version> <!-- or, for Android: --> <version>24.0-android</version> </dependency>
jar :
https://github.com/google/guava/releases/tag/v24.0
一、概述
Guava是对Java API的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava使用了多种设计模式,同时经过了很多测试,得到了越来越多开发团队的青睐。Java最新版本的API采纳了Guava的部分功能,但依旧无法替代。本文以Getting Started With Google Guava原文为学习材料,对Guava中常用的API进行学习,尽量覆盖比较有用的API,包括字符串处理,集合类处理,文件IO处理等。
二、字符串连接器Joiner
2.1 连接多个字符串并追加到StringBuilder
- StringBuilder stringBuilder = new StringBuilder("hello");
- // 字符串连接器,以|为分隔符,同时去掉null元素
- Joiner joiner1 = Joiner.on("|").skipNulls();
- // 构成一个字符串foo|bar|baz并添加到stringBuilder
- stringBuilder = joiner1.appendTo(stringBuilder, "foo", "bar", null, "baz");
- System.out.println(stringBuilder); // hellofoo|bar|baz
2.2 连接List元素并写到文件流
- FileWriter fileWriter = null;
- try{
- fileWriter = new FileWriter(new File("/home/gzx/Documents/tmp.txt"));
- }
- catch(Exception e){
- System.out.println(e.getMessage());
- }
- List<Date> dateList = new ArrayList<Date>();
- dateList.add(new Date());
- dateList.add(null);
- dateList.add(new Date());
- // 构造连接器:如果有null元素,替换为no string
- Joiner joiner2 = Joiner.on("#").useForNull("no string");
- try{
- // 将list的元素的tostring()写到fileWriter,是否覆盖取决于fileWriter的打开方式,默认是覆盖,若有true,则是追加
- joiner2.appendTo(fileWriter, dateList);
- // 必须添加close(),否则不会写文件
- fileWriter.close();
- }
- catch(IOException e){
- System.out.println(e.getMessage());
- }
最后tmp.txt的内容为:
Tue Dec 20 16:51:09 CST 2016#no string#Tue Dec 20 16:51:09 CST 2016
2.3 将Map转化为字符串
- Map<String, String> testMap = Maps.newLinkedHashMap();
- testMap.put("Cookies", "12332");
- testMap.put("Content-Length", "30000");
- testMap.put("Date", "2016.12.16");
- testMap.put("Mime", "text/html");
- // 用:分割键值对,并用#分割每个元素,返回字符串
- String returnedString = Joiner.on("#").withKeyValueSeparator(":").join(testMap);
- System.out.println(returnedString); // Cookies:12332#Content-Length:30000#Date:2016.12.16#Mime:text/html
三、 字符串分割器Splitter
3.1 将字符串分割为Iterable
- // 分割符为|,并去掉得到元素的前后空白
- Splitter sp = Splitter.on("|").trimResults();
- String str = "hello | world | your | Name ";
- Iterable<String> ss = sp.split(str);
- for(String it : ss){
- System.out.println(it);
- }
结果为:
hello
world
your
Name
world
your
Name
3.2 将字符串转化为Map
- // 内部类的引用,得到分割器,将字符串解析为map
- Splitter.MapSplitter ms = Splitter.on("#").withKeyValueSeparator(':');
- Map<String, String> ret = ms.split(returnedString);
- for(String it2 : ret.keySet()){
- System.out.println(it2 + " -> " + ret.get(it2));
- }
结果为:
Cookies -> 12332
Content-Length -> 30000
Date -> 2016.12.16
Mime -> text/html
Content-Length -> 30000
Date -> 2016.12.16
Mime -> text/html
四、 字符串工具类Strings
- System.out.println(Strings.isNullOrEmpty("")); // true
- System.out.println(Strings.isNullOrEmpty(null)); // true
- System.out.println(Strings.isNullOrEmpty("hello")); // false
- // 将null转化为""
- System.out.println(Strings.nullToEmpty(null)); // ""
- // 从尾部不断补充T只到总共8个字符,如果源字符串已经达到或操作,则原样返回。类似的有padStart
- System.out.println(Strings.padEnd("hello", 8, 'T')); // helloTTT
五、字符匹配器CharMatcher
5.1 空白一一替换
- // 空白回车换行对应换成一个#,一对一换
- String stringWithLinebreaks = "hello world\r\r\ryou are here\n\ntake it\t\t\teasy";
- String s6 = CharMatcher.BREAKING_WHITESPACE.replaceFrom(stringWithLinebreaks,'#');
- System.out.println(s6); // hello#world###you#are#here##take#it###easy
5.2 连续空白缩成一个字符
- // 将所有连在一起的空白回车换行字符换成一个#,倒塌
- String tabString = " hello \n\t\tworld you\r\nare here ";
- String tabRet = CharMatcher.WHITESPACE.collapseFrom(tabString, '#');
- System.out.println(tabRet); // #hello#world#you#are#here#
5.3 去掉前后空白和缩成一个字符
- // 在前面的基础上去掉字符串的前后空白,并将空白换成一个#
- String trimRet = CharMatcher.WHITESPACE.trimAndCollapseFrom(tabString, '#');
- System.out.println(trimRet);// hello#world#you#are#here
5.4 保留数字
- String letterAndNumber = "1234abcdABCD56789";
- // 保留数字
- String number = CharMatcher.JAVA_DIGIT.retainFrom(letterAndNumber);
- System.out.println(number);// 123456789
六、 断言工具类Preconditions
- // 检查是否为null,null将抛出异常IllegalArgumentException,且第二个参数为错误消息。
- trimRet = null;
- //Preconditions.checkNotNull(trimRet, "label can not be null");
- int data = 10;
- Preconditions.checkArgument(data < 100, "data must be less than 100");
七、对象工具类 Objects
7.1 Objects的toStringHelper和hashCode方法
- // Book用Objects的相关方法简化toString(),hashCode()的实现。
- // 用ComparisonChain简化compareTo()(Comparable接口)方法的实现。
- Book book1 = new Book();
- book1.setAuthor("Tom");
- book1.setTitle("Children King");
- book1.setIsbn("11341332443");
- System.out.println(book1);
- System.out.println(book1.hashCode());
- Book book2 = new Book();
- book2.setAuthor("Amy");
- book2.setTitle("Children King");
- book2.setIsbn("111");
- System.out.println(book2);
- System.out.println(book2.hashCode());
- System.out.println(book1.compareTo(book2));
结果为:
Book{author=Tom, title=Children King, isbn=11341332443, price=0.0}
268414056
Book{author=Amy, title=Children King, isbn=111, price=0.0}
-1726402621
1
268414056
Book{author=Amy, title=Children King, isbn=111, price=0.0}
-1726402621
1