package com.teriste.guava;
import com.alibaba.fastjson.JSON;
import com.google.common.base.CharMatcher;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.*;
import com.google.common.primitives.Ints;
import java.util.*;
/**
* 使用Google Guava工具类
*/
public class GuavaAction {
/**
* guava连接器
* 跳过null
*/
private static final Joiner joinerSkipNull = Joiner.on(",").skipNulls();
/**
* guava连接器
* 替换null
*/
private static final Joiner joinerUseNull = Joiner.on(",").useForNull("empty");
/**
* guava分割器
*/
private static final Splitter splitter = Splitter.on(",").omitEmptyStrings();
/**
* 字符匹配
*/
private static final CharMatcher matchAny = CharMatcher.any();
/**
* 将list连接成字符串
* @param sourceList
* @return
*/
public static String joinList2String(List<String> sourceList){
String target = joinerSkipNull.join(sourceList.toArray());
System.out.println("after join list skip null:"+target); //after join list skip null:a,b,c,null,d
target = joinerUseNull.join(sourceList.toArray());
System.out.println("after join list user null:"+target); //after join list user null:a,b,c,null,empty,d
return target;
}
/**
* 将字符串分割成list
* @param sourceString
* @return
*/
public static List<String> splitString2List(String sourceString){
List<String> target = splitter.splitToList(sourceString);
System.out.println("after split string:"+ JSON.toJSONString(target)); //after split string:["a","b","c"," ","null","d"]
return target;
}
/**
* 使用Ints扩展原生类型的功能
* 比如避免循环操作int数组
*/
public static void extendType(){
//将基本类型变量转换为数组
List<Integer> ints= Ints.asList(1,3,4,3,5,7,7,6,8);
int [] intArr=Ints.toArray(ints);
System.out.println("int数组是否包含数字10:"+Ints.contains(intArr,6)); //int数组是否包含数字10:true
System.out.println("join list:"+Ints.join(",",1,3,5,6,8)); //join list:1,3,5,6,8
System.out.println("数字3在数组中的位置(第一次出现):"+Ints.indexOf(intArr,3)); //数字3在数组中的位置:1
System.out.println("数字3在数组中最后一次出现的位置:"+Ints.lastIndexOf(intArr,3)); //数字3在数组中最后一次出现的位置:3
System.out.println("数组中的最小值:"+Ints.min(intArr)+",数组中的最大值:"+Ints.max(intArr)); //数组中的最小值:1,数组中的最大值:8
}
/**
* 使用MultiSet实现无序且可以重复的集合
* List:有序且可以重复的集合
* Set:无序且不可以重复的集合
*/
public static void useMultiSet(){
List<String> list=Arrays.asList("a","b","c","b","d","c","c");
//创建HashMultiset对象
Multiset<String> multiset = HashMultiset.create();
multiset.add("a");
multiset.add("a");
multiset.add("c");
multiset.add("b");
multiset.add("c");
System.out.println("multiset element:"+multiset.toString()); //multiset element:[a x 2, b, c x 2]
multiset.forEach((x)-> System.out.print(x+"\t")); //a a b c c
System.out.println();
}
/**
* Collections Immutable与Guava
*/
public static void immutaList(){
List<String> list=new ArrayList<>();
list.add("a");
list.add("b");
List<String> unmodifyList= Collections.unmodifiableList(list);
//immutaList.add("xx");//java.lang.UnsupportedOperationException
//修改源集合的值,不可变集合的值也被修改了,说明它们引用的是同一个集合
//因此Collections.unmodifiableList()不能确保集合不可变
list.add("zz");
System.out.println("unmodifyList:"+JSON.toJSONString(unmodifyList)); //["a","b","zz"]
//如果想要确保集合不可变,只能通过Arrays.asList()来实现
List<String> list2= Arrays.asList("a","b","c","null",null,"d");
//list2.add("yy"); //java.lang.UnsupportedOperationException
System.out.println("list2:"+JSON.toJSONString(list2));
System.out.println("#########################");
//Guava ImmutableList
List<String> immutableList = ImmutableList.of("a","b","c");
//immutableList.add("s"); //java.lang.UnsupportedOperationException
System.out.println("immutableList:"+JSON.toJSONString(immutableList));
}
/**
* 使用Guava MultiMap代替Map<String,List<T>
*/
public static void useMultiMap(){
//创建Multimap
Multimap<String,String> multimap = HashMultimap.create();
multimap.put("11","aa");
multimap.put("11","bb");
//重复元素会覆盖,value是Set
multimap.put("11","aa");
multimap.put("11","cc");
//获取multiMap中key对应的Collection
System.out.println("map value:"+multimap.get("11")); //map value:[aa, bb, cc]
//删除multiMap中key对应Collection中的指定值
multimap.remove("11","bb");
System.out.println("map value:"+multimap.get("11")); //map value:[aa, cc]
//判断某个值在map的key对应的Collection中是否存在,底层实际上还是iterator遍历
System.out.println("map value is contains aa:"+multimap.containsValue("aa"));
}
/**
* key与value一对一的map
*/
public static void useBiMap(){
//BiMap内部维护了两个map,分别是键值相反的map
BiMap<String,String> biMap = HashBiMap.create();
biMap.put("zhangsan","11@email.com");
//如果键已存在就无法put
//biMap.put("zhangsan","22@email.com");//java.lang.IllegalArgumentException: value already present: 22@email.com
//可以强制put,会更新键值
biMap.forcePut("zhangsan","22@email.com");
//如果值已存在就无法put
//biMap.put("lisi","22@email.com"); //java.lang.IllegalArgumentException: value already present: 22@email.com
biMap.put("lisi","33@email.com");
System.out.println("biMap:"+JSON.toJSONString(biMap)); //biMap:{"zhangsan":"22@email.com","lisi":"33@email.com"}
//通过值查询键
System.out.println("22@email.com对应的key:"+biMap.inverse().get("22@email.com")); //22@email.com对应的key:zhangsan
}
/**
* 使用Table来表示数据库表
* 对应关系是某行、某列的值
* row,column,value
*/
public static void useTable(){
//定义一个学生表,行是年级,列是班级,姓名,学科,成绩
Table<String,String,String> students=HashBasedTable.create();
students.put("王二","数学","90");
students.put("王二","英语","95");
students.put("王二","语文","80");
students.put("张三","数学","88");
students.put("张三","英语","85");
students.put("张三","语文","90");
Set<Table.Cell<String,String,String>> set = students.cellSet();
for (Table.Cell cell:set){
System.out.println(cell.getRowKey()+","+cell.getColumnKey()+","+cell.getValue());
}
}
public static void main(String[] args) {
List<String> sourceList= Arrays.asList("a","b","c","null",null,"d");
//1.将list中的元素通过分隔符连接
joinList2String(sourceList);
String source="a,b,c, ,null,d";
//2.将字符串根据分隔符拆分成list
splitString2List(source);
//3.匹配字符
String matchString = " Hello,World! ";
System.out.println(matchAny.trimFrom(matchString));
//4.Ints扩展基本类型功能
extendType();
//5.使用MultiSet实现无序且可以重复的集合
useMultiSet();
//6.使用Guava ImmutableList实现不可变list,类似还有不可变map
immutaList();
//7.使用Guava MultiMap代替Map<String,List<T>
//大大方便了对map value的增删改查
useMultiMap();
//8.key与value一对一的map
useBiMap();
//9.
useTable();
}
}