概述
工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率。谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来。所以就诞生了guava。
guava的优点:
· 高效设计良好的API,被Google的开发者设计,实现和使用
· 遵循高效的java语法实践
· 使代码更刻度,简洁,简单
· 节约时间,资源,提高生产力
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:
· 集合 [collections]
· 缓存 [caching]
· 原生类型支持 [primitives support]
· 并发库 [concurrency libraries]
· 通用注解 [common annotations]
· 字符串处理 [string processing]
· I/O 等等。
引入gradle依赖(引入Jar包)
compile ‘com.google.guava:guava:26.0-jre’
1.集合的创建
// 普通Collection的创建
List list = Lists.newArrayList();
Set set = Sets.newHashSet();
Map<String, String> map = Maps.newHashMap();
// 不变Collection的创建
ImmutableList iList = ImmutableList.of(“a”, “b”, “c”);
ImmutableSet iSet = ImmutableSet.of(“e1”, “e2”);
ImmutableMap<String, String> iMap = ImmutableMap.of(“k1”, “v1”, “k2”, “v2”);
创建不可变集合 先理解什么是immutable(不可变)对象
· 在多线程操作下,是线程安全的
· 所有不可变集合会比可变集合更有效的利用资源
· 中途不可改变
ImmutableList immutableList = ImmutableList.of(“1”,“2”,“3”,“4”);
这声明了一个不可变的List集合,List中有数据1,2,3,4。类中的 操作集合的方法(譬如add, set, sort, replace等)都被声明过期,并且抛出异常。 而没用guava之前是需要声明并且加各种包裹集合才能实现这个功能
// add 方法
@Deprecated @Override
public final void add(int index, E element) {
throw new UnsupportedOperationException();
}
当我们需要一个map中包含key为String类型,value为List类型的时候,以前我们是这样写的
Map<String,List> map = new HashMap<String,List>();
List list = new ArrayList();
list.add(1);
list.add(2);
map.put(“aa”, list);
System.out.println(map.get(“aa”));//[1, 2]
而现在
Multimap<String,Integer> map = ArrayListMultimap.create();
map.put(“aa”, 1);
map.put(“aa”, 2);
System.out.println(map.get(“aa”)); //[1, 2]
其他的黑科技集合
MultiSet: 无序+可重复 count()方法获取单词的次数 增强了可读性+操作简单
创建方式: Multiset set = HashMultiset.create();
Multimap: key-value key可以重复
创建方式: Multimap<String, String> teachers = ArrayListMultimap.create();
BiMap: 双向Map(Bidirectional Map) 键与值都不能重复
创建方式: BiMap<String, String> biMap = HashBiMap.create();
Table: 双键的Map Map–> Table–>rowKey+columnKey+value //和sql中的联合主键有点像
创建方式: Table<String, String, Integer> tables = HashBasedTable.create();
…等等(guava中还有很多java里面没有给出的集合类型)
2.将集合转换为特定规则的字符串
以前我们将list转换为特定规则的字符串是这样写的:
//use java
List list = new ArrayList();
list.add(“aa”);
list.add(“bb”);
list.add(“cc”);
String str = “”;
for(int i=0; i<list.size(); i++){
str = str + “-” +list.get(i);
}
//str 为-aa-bb-cc
//use guava
List list = new ArrayList();
list.add(“aa”);
list.add(“bb”);
list.add(“cc”);
String result = Joiner.on("-").join(list);
//result为 aa-bb-cc
把map集合转换为特定规则的字符串
Map<String, Integer> map = Maps.newHashMap();
map.put(“xiaoming”, 12);
map.put(“xiaohong”,13);
String result = Joiner.on(",").withKeyValueSeparator("=").join(map);
// result为 xiaoming=12,xiaohong=13
3.将String转换为特定的集合
//use java
List list = new ArrayList();
String a = “1-2-3-4-5-6”;
String[] strs = a.split("-");
for(int i=0; i<strs.length; i++){
list.add(strs[i]);
}
//use guava
String str = “1-2-3-4-5-6”;
List list = Splitter.on("-").splitToList(str);
//list为 [1, 2, 3, 4, 5, 6]
如果
str=“1-2-3-4- 5- 6 “;
guava还可以使用 omitEmptyStrings().trimResults() 去除空串与空格
String str = “1-2-3-4- 5- 6 “;
List list = Splitter.on(”-”).omitEmptyStrings().trimResults().splitToList(str);
System.out.println(list);
将String转换为map
String joinResult = Joiner.on(” “).join(new String[]{“hello”,“world”});
System.out.println(joinResult);
String str = “xiaoming=11,xiaohong=23”;
Map<String,String> mapTest = Splitter.on(”,”).withKeyValueSeparator("=").split(str);
4.guava还支持多个字符切割,或者特定的正则分隔
String input1 = “aa.dd,ff,.”;
List result = Splitter.onPattern("[.|,]").omitEmptyStrings().splitToList(input1);
关于字符串的操作 都是在Splitter这个类上进行的
// 判断匹配结果
boolean result1 = CharMatcher.inRange(‘a’, ‘z’).or(CharMatcher.inRange(‘A’, ‘Z’)).matches(‘K’); //true
System.out.println(result1);
// 保留数字文本 CharMatcher.digit() 已过时 retain 保留
//String s1 = CharMatcher.digit().retainFrom(“abc 123 efg”); //123
String s1 = CharMatcher.inRange(‘0’, ‘9’).retainFrom(“abc 123 efg”); // 123
System.out.println(s1);
// 删除数字文本 remove 删除
// String s2 = CharMatcher.digit().removeFrom(“abc 123 efg”); //abc efg
String s2 = CharMatcher.inRange(‘0’, ‘9’).removeFrom(“abc 123 efg”); // abc efg
System.out.println(s2);
5. 集合的过滤