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
在这里插入图片描述
2.点击Add Library
在这里插入图片描述
在这里插入图片描述
注意选JUnit4
在这里插入图片描述
Apply OK 然后就可以了 添加成功
使用方法

  1. 方法上面写上@Test 叫注解 导一下包
    在这里插入图片描述
    2.选中方法名 右键 Run as -> JUnit Test 然后出现这个
    在这里插入图片描述
    绿条表示通过的意思 成功运行 没有错误

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的内容截去

在这里插入图片描述

  • 这里先创建两个Function
  • 然后使用Guava里面的Functions类的compose组合方法 将f1 f2 组合起来
  • 注意导入包时 是第二个Google的base类 才是Guava的
    在这里插入图片描述
    然后再使用转换函数转换 结果如图
    在这里插入图片描述

这个函数也可以简洁形式写 使用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<String> set = Sets.newHashSet();
		// 14版可用
		// Constraint<String> 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<String> 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<String> readList = Collections.unmodifiableList(list);
		// readList.add("vince");

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值