一、导入Guava
在pom.xml 中加入依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
二、Ordering的用法
@SpringBootTest
public class OrderingTest {
@Test
public void OrderingTest_NotNULL(){
List<String> list = Lists.newArrayList();
list.add("apple");
list.add("hurry");
list.add("banana");
list.add("banner");
list.add("fdsfg");
//natural():使用Comparable类型的自然顺序, 例如:整数从小到大,字符串是按字典顺序;
Ordering<String> orderingByNatural = Ordering.natural();
//reverse(): 返回与当前Ordering相反的排序:
Ordering<String> orderingByReverse = Ordering.natural().reverse();
// usingToString() :使用toString()返回的字符串按字典顺序进行排序;
Ordering<Object> orderingByUsingToStr = Ordering.usingToString();
// arbitrary() :返回一个所有对象的任意顺序,
Ordering<Object> orderingByarbitrary = Ordering.arbitrary();
System.out.println("natural:"+orderingByNatural.sortedCopy(list));
System.out.println("natural Reverse :"+orderingByReverse.sortedCopy(list));
System.out.println("orderingByUsingToStr:"+orderingByUsingToStr.sortedCopy(list));
System.out.println("arbitraryOrdering:"+ orderingByarbitrary.sortedCopy(list));
}
@Test
public void OrderingTest_NULL(){
List<String> list = Lists.newArrayList();
list.add("apple");
list.add("hurry");
list.add("banana");
list.add("banner");
list.add(null);
//返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
Ordering<String> orderingByNatural = Ordering.natural().nullsFirst();
//返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
Ordering<Object> orderingByUsingToStr = Ordering.usingToString().nullsLast();
System.out.println("natural:"+orderingByNatural.sortedCopy(list));
System.out.println("orderingByUsingToStr:"+orderingByUsingToStr.sortedCopy(list));
}
}
三、新集合的用法
1、Multiset
Guava提供了一个新集合类型 Multiset,它可以多次添加相等的元素。可以用Multiset跟踪每种对象的数量,所以你可以用来进行数字统计。(传统方法用Map进行统计,效率低下)。
Multiset接口定义的接口主要有:
add(E element) :向其中添加单个元素
add(E element,int occurrences) : 向其中添加指定个数的元素
count(Object element) : 返回给定参数元素的个数
remove(E element) : 移除一个元素,其count值会对应减少
remove(E element,int occurrences): 移除相应个数的元素
elementSet() : 将不同的元素放入一个Set中
entrySet(): 类似与Map.entrySet 返回Set<Multiset.Entry>。包含的Entry支持使用getElement()和getCount()
setCount(E element ,int count): 设定某一个元素的重复次数
setCount(E element,int oldCount,int newCount): 将符合原有重复个数的元素修改为新的重复次数
retainAll(Collection c) : 保留出现在给定集合参数的所有的元素
removeAll(Collectionc) : 去除出现给给定集合参数的所有的元素
/**
* Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计
* 记录字符串在数组中出现的次数
*/
public void MultiSetTest(){
String strWorld="wer|dfd|dd|dfd|dda|de|dr";
String[] words=strWorld.split("\\|");
List<String> wordList=new ArrayList<String>();
for(String word : words){
wordList.add(word);
}
Multiset<String> multiSet = HashMultiset.create();
multiSet.addAll(wordList);
for(String key:multiSet.elementSet()){
System.out.println(key+" count:"+multiSet.count(key));
}
//multiset.size() 方法返回的是所有的元素的总和,相当于是将所有重复的个数相加。
System.out.println("size = "+multiSet.size());
//如果需要知道每个元素的个数可以使用elementSet().size()得到.
System.out.println("不同元素个数="+multiSet.elementSet().size());
}
运行结果如下:
2、Multimap
可以替代 Map<String,List> 的一种集合类型。
multimap可以把键映射到任意多个值。
multimap一般使用其实现的接口,如ListMultimap或SetMultimap接口。
multimap的方法主要有:
put(K,V)
putAll(K, Iterable<>)
remove(K,V)
removeAll(K)
get(K)
values() :返回值的集合形式
size()
asMap():为Multimap<K, V>提供Map<K,Collection>形式的视图。返回的Map支持remove操作,并且会反映到底层的Multimap,但它不支持put或putAll操作。
entries(): 用Collection<Map.Entry<K, V>>返回Multimap中所有”键-单个值映射”——包括重复键。(对SetMultimap,返回的是Set)
/**
* Multimap是把键映射到任意多个值的一般方式。
*/
public void MultiMapTest(){
Multimap<String,String> multimap = ArrayListMultimap.create();
// Adding some key/value
multimap.put("Fruits", "Bannana");
multimap.put("Fruits", "Apple");
multimap.put("Fruits", "Pear");
multimap.put("Fruits", "Pear");
multimap.put("Vegetables", "Carrot");
//size()获取元素个数
System.out.println("size="+multimap.size());
//获取元素
System.out.println("fruits = "+multimap.get("Fruits"));
// 遍历获取值
for (String value : multimap.values()) {
System.out.println(value);
}
//移除
multimap.remove("Fruits","Pear");
System.out.println("fruits = "+multimap.get("Fruits"));
//移除所有
multimap.removeAll("Fruits");
System.out.println("fruits = "+multimap.get("Fruits"));
}
结果:
3、Table
Table有如下几种实现:
HashBasedTable:本质上用HashMap<R, HashMap<C, V>>实现;
TreeBasedTable:本质上用TreeMap<R, TreeMap<C,V>>实现;
ImmutableTable:本质上用ImmutableMap<R, ImmutableMap<C, V>>实现;注:ImmutableTable对稀疏或密集的数据集都有优化。
ArrayTable:要求在构造时就指定行和列的大小,本质上由一个二维数组实现,以提升访问速度和密集。
四、split
Java自带的split带正则式,效率较低,可以考虑使用Guava的guava工具
String str1="a,b,c,d,,f,g";
//可以考虑使用apache的StringUtils.split(string,char)
List<String> list = Arrays.asList(StringUtils.split(str1, ","));
//可以考虑guava工具
List<String> list1=Splitter.on(",").splitToList(str1);