Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用

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
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第1张图片
2.点击Add Library
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第2张图片
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第3张图片
注意选JUnit4
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第4张图片
Apply OK 然后就可以了 添加成功Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第5张图片
使用方法

  1. 方法上面写上@Test 叫注解 导一下包
    Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第6张图片
    2.选中方法名 右键 Run as -> JUnit Test 然后出现这个
    Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第7张图片
    绿条表示通过的意思 成功运行 没有错误

1、只读设置

没有Guava之前 只读设置有Arrays.asList方法 创建固定长度的集合
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第8张图片
结果就是报异常 不支持此类操作
还有另一种方法
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第9张图片
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第10张图片
这个意思就是 创建一个可变的list集合 存进去东西 然后使用Collections里面的unmodifiableList方法将其变成不可变的
再加入新的东西
报错
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第11张图片
那么我们看一下Guava如何实现只读设置:
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第12张图片
同样不能进行add操作
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第13张图片


所以 实现只读 有三个方法:
1).Arrays.asList方法
2).Collections里面的unmodifiableList方法
3).Guava里面的ImmutableList的方法of


2、函数式编程:过滤器
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第14张图片
这个类的filter方法第二个参数是Predicate断言接口
将j打头的内容过滤出来
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第15张图片
注意 Lists.newArrayList 和 Collection2.filter都是Guava里的类和方法


3、函数式编程:转换

Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第16张图片
在这里插入图片描述
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第17张图片
时间有问题 还没排除 但是转换这个功能完成了 先不管了


4、组合式函数编程

把所有元素转换成大写 并 求将每个单词长度大于4的内容截去

Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第18张图片

  • 这里先创建两个Function
  • 然后使用Guava里面的Functions类的compose组合方法 将f1 f2 组合起来
  • 注意导入包时 是第二个Google的base类 才是Guava的
    Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第19张图片
    然后再使用转换函数转换 结果如图
    Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第20张图片

这个函数也可以简洁形式写 使用Lambra表达式写 试试?


5、加入约束:非空、长度验证 了解一下

约束这个Constraint在14这个版本可以 后来淘汰了
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第21张图片
这个类还可以用
Preconditions类下的checkArgument() 方法 是用来检查参数的
Preconditions类下的checkNotNull() 方法 是用来检查不为空的
看一下源码
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第22张图片
如果为空 抛出异常
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第23张图片
如果这个表达式不成立 就抛异常


6、集合操作:交集、差集、并集

Sets是Guava里面的类 创建集合 newHashSet()
交集Sets.intersection 结果是 3
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第24张图片
差集Sets.difference(set1, set2) 求出set1里面 set2没有的 以Set1为主 结果是 1 2
结果只显示第一个集合Set1的内容 第二个集合Set2只作判断使用 第二个集合有3 所以排除3 显示结果 1 2

并集Sets.union() 结果1 2 3 4 5 把重复的去掉
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第25张图片


7、Multiset:无序可重复
拆分字符串后判断某个单词出现的次数
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第26张图片
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第27张图片


8、Multimap key可以重复
案例 看一下每个作者写的书都有什么
下面代码的意思就是说
先建一个map 将内容存进去 因为Map的key不能重复 所以将书名存到key 作者存为value
第二步呢 因为Multimap 的key可以重复 所以所以这里就将第一步的map key和value取出来 调换位置 存在mmap数组
第三步 输出 结果如图
注意下 这个key可以重复 实际上只是存了一个key 但是这1个key的多个value值 存到了 Collection里面了
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第28张图片
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第29张图片


9、BiMap:双向Map(bidirectional Map) 键与值不能重复
案例 通过手机号查询名字
刚开始存的时候 key为名字 value为手机号
但只有get方法 通过key获取value
所以我们反转 反转后 key就是手机号 可以通过它获取名字
所以我们使用BiMap来存 因为key 与 value 都是唯一的 不重复 所以可以调过来
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第30张图片


10、双键的Map -->Table —>rowKey+columnKye+value
联合两个key 作值的存储
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第31张图片
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第32张图片
Java基础之 144.Guava开源组件使用 145 146 147 单元测试的简单使用_第33张图片


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对集合的支持

你可能感兴趣的:(Java,Java基础,Guava开源组件,JUnit单元测试)