guava对集合的支持
版本下载:https://repo1.maven.org/maven2/com/google/guava/guava/
下载这三个 然后将第一个引入类库 导入项目当中
javadoc是文档
sources是源码 这两个是看的
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
Guava对JDK集合的扩展,这是Guava最成熟和为人所知的部分。
1、 不可变集合:用不变的集合进行防御性编程和性能提升。
2 、新集合类型: multisets, multimaps, tables,等
3、 强大的集合工具类:提供java.util.Collections中没有的集合工具
4 、扩展工具类:让实现和扩展集合类变得更容易,比如创建Collection的装饰器,或实现迭代器
1、只读设置
2、函数式编程:过滤器
3、函数式编程:转换
4、组合式函数编程
5、加入约束:非空、长度验证
6、集合操作:交集、差集、并集
7、Multiset:无序可重复
8、Multimap key可以重复
9、BiMap:双向Map(bidirectional Map) 键与值不能重复
10、双键的Map -->Table —>rowKey+columnKye+value
引入单元测试类库并进行单元测试
1.右击项目 点击Properties
2.点击Add Library
注意选JUnit4
Apply OK 然后就可以了 添加成功
使用方法
1、只读设置
没有Guava之前 只读设置有Arrays.asList方法 创建固定长度的集合
结果就是报异常 不支持此类操作
还有另一种方法
这个意思就是 创建一个可变的list集合 存进去东西 然后使用Collections里面的unmodifiableList方法将其变成不可变的
再加入新的东西
报错
那么我们看一下Guava如何实现只读设置:
同样不能进行add操作
所以 实现只读 有三个方法:
1).Arrays.asList方法
2).Collections里面的unmodifiableList方法
3).Guava里面的ImmutableList的方法of
2、函数式编程:过滤器
这个类的filter方法第二个参数是Predicate断言接口
将j打头的内容过滤出来
注意 Lists.newArrayList 和 Collection2.filter都是Guava里的类和方法
3、函数式编程:转换
4、组合式函数编程
把所有元素转换成大写 并 求将每个单词长度大于4的内容截去
这个函数也可以简洁形式写 使用Lambra表达式写 试试?
5、加入约束:非空、长度验证 了解一下
约束这个Constraint在14这个版本可以 后来淘汰了
这个类还可以用
Preconditions类下的checkArgument() 方法 是用来检查参数的
Preconditions类下的checkNotNull() 方法 是用来检查不为空的
看一下源码
如果为空 抛出异常
如果这个表达式不成立 就抛异常
6、集合操作:交集、差集、并集
Sets是Guava里面的类 创建集合 newHashSet()
交集Sets.intersection 结果是 3
差集Sets.difference(set1, set2) 求出set1里面 set2没有的 以Set1为主 结果是 1 2
结果只显示第一个集合Set1的内容 第二个集合Set2只作判断使用 第二个集合有3 所以排除3 显示结果 1 2
并集Sets.union() 结果1 2 3 4 5 把重复的去掉
7、Multiset:无序可重复
拆分字符串后判断某个单词出现的次数
8、Multimap key可以重复
案例 看一下每个作者写的书都有什么
下面代码的意思就是说
先建一个map 将内容存进去 因为Map的key不能重复 所以将书名存到key 作者存为value
第二步呢 因为Multimap 的key可以重复 所以所以这里就将第一步的map key和value取出来 调换位置 存在mmap数组
第三步 输出 结果如图
注意下 这个key可以重复 实际上只是存了一个key 但是这1个key的多个value值 存到了 Collection里面了
9、BiMap:双向Map(bidirectional Map) 键与值不能重复
案例 通过手机号查询名字
刚开始存的时候 key为名字 value为手机号
但只有get方法 通过key获取value
所以我们反转 反转后 key就是手机号 可以通过它获取名字
所以我们使用BiMap来存 因为key 与 value 都是唯一的 不重复 所以可以调过来
10、双键的Map -->Table —>rowKey+columnKye+value
联合两个key 作值的存储
package com.guava;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.BiMap;
import com.google.common.collect.Collections2;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;
import com.google.common.collect.Table;
import com.google.common.collect.Table.Cell;
public class GuavaDemo {
//双键的Map -->Table --->rowKey+columnKye+value
@Test
public void testGuava10(){
Table<String, String, Integer> table = HashBasedTable.create();
table.put("jack", "java", 80);
table.put("tom", "php", 70);
table.put("bin", "java", 59);
table.put("lily", "ui", 98);
Set<Cell<String,String,Integer>> cells = table.cellSet();
for(Cell c: cells){
System.out.println(c.getRowKey()+"-"+c.getColumnKey()+"-"+c.getValue());
}
}
//BiMap:双向Map(bidirectional Map) 键与值不能重复
@Test
public void testGuava9(){
BiMap<String, String> map = HashBiMap.create();
map.put("finally_test", "18201583398");
map.put("bin_test", "18388881521");
String name = map.inverse().get("18201583398");
System.out.println(name);
//System.out.println(map.inverse().inverse()==map);
}
// Multimap:key可重复
@Test
public void testGuava8() {
Map<String,String> map = new HashMap<>();
map.put("Java从入门到精通", "bin");
map.put("Android从入门到精通", "bin");
map.put("PHP从入门到精通", "jack");
map.put("笑看人生", "vince");
Multimap<String, String> mmap = ArrayListMultimap.create();
Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator();
while(iter.hasNext()){
Map.Entry<String, String> entry = iter.next();
mmap.put(entry.getValue(), entry.getKey());
}
Set<String> keySet = mmap.keySet();
for(String key: keySet){
Collection<String> values = mmap.get(key);
System.out.println(key+"->"+values);
}
}
// Multiset:无序可重复
@Test
public void testGuava7() {
String s = "good good study day day up";
String[] ss = s.split(" ");
HashMultiset<String> set = HashMultiset.create();
for (String str : ss) {
set.add(str);
}
Set<String> set2 = set.elementSet();
for (String str : set2) {
System.out.println(str + ":" + set.count(str));
}
}
// 集合操作:交集、差集、并集
@Test
public void testGuava6() {
Set<Integer> set1 = Sets.newHashSet(1, 2, 3);
Set<Integer> set2 = Sets.newHashSet(3, 4, 5);
// 交集
SetView<Integer> v1 = Sets.intersection(set1, set2);
// v1.forEach(System.out::println);
// 差集
SetView<Integer> v2 = Sets.difference(set1, set2);
// v2.forEach(System.out::println);
// 并集
SetView<Integer> v3 = Sets.union(set1, set2);
v3.forEach(System.out::println);
}
/**
* 加入约束:非空、长度验证
*/
@Test
public void testGuava5() {
// Set set = Sets.newHashSet();
// 14版可用
// Constraint constraint = new Constraint<>(){
// @Override
// public String checkElement(String element){
//
// }
// }
// Preconditions.checkArgument(expression);
// Preconditions.checkNotNull(reference)
}
/**
* 组合式函数
*/
@Test
public void testGuava4() {
List<String> list = Lists.newArrayList("java", "php", "jack", "h5", "javascript");
Function<String, String> f1 = new Function<String, String>() {
@Override
public String apply(String t) {
return t.length() > 4 ? t.substring(0, 4) : t;
}
};
Function<String, String> f2 = new Function<String, String>() {
@Override
public String apply(String t) {
return t.toUpperCase();
}
};
Function<String, String> f = Functions.compose(f1, f2);
Collection<String> coll = Collections2.transform(list, f);
coll.forEach(System.out::println);
}
/**
* 转换
*/
@Test
public void testGuava3() {
Set<Long> timeSet = Sets.newHashSet(20121212L, 20170520L, 20160808L);
Collection<String> timeCollect = Collections2.transform(timeSet,
(e) -> new SimpleDateFormat("yyyy-MM-dd").format(e));
timeCollect.forEach(System.out::println);
}
/**
* 过滤器
*/
@Test
public void testGuava2() {
List<String> list = Lists.newArrayList("java", "php", "jack", "h5", "javascript");
Collection<String> result = Collections2.filter(list, (e) -> e.startsWith("j"));
result.forEach(System.out::println);
}
/**
* 设置 只读
*/
@Test
public void testGuava1() {
System.out.println("test guava");
// List list = Arrays.asList("jack","tom","lily","bin");
// list.add("vince");
List<String> list = new ArrayList<>();
list.add("jack");
list.add("tom");
list.add("lily");
list.add("bin");
// List readList = Collections.unmodifiableList(list);
// readList.add("vince");
// ImmutableList iList =
// ImmutableList.of("jack","tom","lily","bin");
// iList.add("vince");
}
}
前面博客的学习内容目录
1、集合框架概述
2、集合框架List接口
3、集合框架Set接口
4、集合框架Iterator接口
5、JDK1.8新特性之Stream
6、集合框架Map接口
7、Collections与Optional工具类
8、Queue、Deque接口
9、对象一对多与多对多关系
10、迭代器设计模式
11、guava对集合的支持