guava快速入门(二)
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。
guava类似Apache Commons工具集
Collection
不可变集合
不可变对象有很多优点,包括:
- 当对象被不可信的库调用时,不可变形式是安全的;
 - 不可变对象被多个线程调用时,不存在竞态条件问题
 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);
不可变对象因为有固定不变,可以作为常量来安全使用。
JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但:
笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景;
不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;
低效:包装过的集合仍然保有可变集合的开销,比如并发修改的检查、散列表的额外空间,等等。
创建不可变集合方法:
copyOf方法,如ImmutableSet.copyOf(set);
of方法,如ImmutableSet.of(“a”, “b”, “c”)或 ImmutableMap.of(“a”, 1, “b”, 2);
Builder工具
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; public class ImmutableDemo {
public static void main(String[] args) {
ImmutableSet<String> set = ImmutableSet.of("a", "b", "c", "d");
ImmutableSet<String> set1 = ImmutableSet.copyOf(set);
ImmutableSet<String> set2 = ImmutableSet.<String> builder().addAll(set).add("e").build();
ImmutableList<String> list = set.asList(); System.out.println("set:"+set);
System.out.println("set1:"+set1);
System.out.println("set2:"+set2);
//set.add("f");//java.lang.UnsupportedOperationException
}
}
返回:
set:[a, b, c, d]
set1:[a, b, c, d]
set2:[a, b, c, d, e]
新型集合类
Multiset
Multiset可统计一个词在文档中出现了多少次
import com.google.common.collect.LinkedHashMultiset;
import com.google.common.collect.Multiset; public class MultiSetDemo { public static void main(String[] args) {
Multiset<String> set = LinkedHashMultiset.create();
set.add("a");
set.add("a");
set.add("lucas");
set.add("lucas");
set.setCount("a", 5); // 添加或删除指定元素使其在集合中的数量是count
System.out.println(set);
System.out.println(set.count("a")); // 给定元素在Multiset中的计数
System.out.println(set.size()); // 所有元素计数的总和,包括重复元素
System.out.println(set.elementSet().size()); // 所有元素计数的总和,不包括重复元素
set.clear(); // 清空集合
System.out.println(set); } }
返回:
[a x 5, lucas x 2]
5
7
2
[]
Multimap
Multimap可以很容易地把一个键映射到多个值。换句话说,Multimap是把键映射到任意多个值的一般方式。
import java.util.Collection;
import java.util.Map; import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap; public class MultiMapDemo { public static void main(String[] args) {
Multimap<String, Integer> map = HashMultimap.create(); // Multimap是把键映射到任意多个值的一般方式
map.put("a", 1); // key相同时不会覆盖原value
map.put("a", 2);
map.put("a", 3);
map.put("b", 1);
map.put("b", 2);
System.out.println(map); // {a=[1, 2, 3]}
System.out.println(map.get("a")); // 返回的是集合
System.out.println(map.size()); // 返回所有”键-单个值映射”的个数,而非不同键的个数
System.out.println(map.keySet().size()); // 返回不同key的个数
Map<String, Collection<Integer>> mapView = map.asMap();
System.out.println(mapView);
}
}
返回:
{a=[1, 2, 3], b=[1, 2]}
[1, 2, 3]
5
2
{a=[1, 2, 3], b=[1, 2]}
BiMap
BiMap
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; public class BitMapDemo { public static void main(String[] args) {
BiMap<String, String> biMap = HashBiMap.create();
biMap.put("sina", "sina.com");
biMap.put("qq", "qq.com");
biMap.put("sina", "sina.cn"); // 会覆盖原来的value
/*
* 在BiMap中,如果你想把键映射到已经存在的值,会抛出IllegalArgumentException异常
* 如果对特定值,你想要强制替换它的键,请使用 BiMap.forcePut(key, value)
*/
// 抛出异常java.lang.IllegalArgumentException: value already present: qq.com
//biMap.put("tecent", "qq.com");
biMap.forcePut("tecent", "qq.com"); // 强制替换key
System.out.println(biMap);
System.out.println(biMap.inverse()); // 翻转value-key
System.out.println(biMap.inverse().get("sina.cn")); // 通过value找key
System.out.println(biMap.inverse().inverse() == biMap); // true } }
返回:
{sina=sina.cn, tecent=qq.com}
{sina.cn=sina, qq.com=tecent}
sina
true
Table
Table它有两个支持所有类型的键:”行”和”列”。
import java.util.Set; import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table; public class TableDemo { public static void main(String[] args) {
// 记录学生在某门课上的成绩
Table<String, String, Integer> table = HashBasedTable.create();
table.put("jack", "java", 100);
table.put("jack", "c", 90);
table.put("mike", "java", 93);
table.put("mike", "c", 100);
Set<Table.Cell<String, String, Integer>> cells = table.cellSet();
for (Table.Cell<String, String, Integer> cell : cells) {
System.out.println(cell.getRowKey() + " " + cell.getColumnKey() + " " + cell.getValue());
}
System.out.println("----------------------");
System.out.println(table.row("jack"));
System.out.println(table);
System.out.println(table.rowKeySet());
System.out.println(table.columnKeySet());
System.out.println(table.values());
} }
返回:
mike java 93
mike c 100
jack java 100
jack c 90
----------------------
{java=100, c=90}
{mike={java=93, c=100}, jack={java=100, c=90}}
[mike, jack]
[java, c]
[93, 100, 100, 90]
Collections2
filter():只保留集合中满足特定要求的元素
import java.util.Collection;
import java.util.List; import com.google.common.collect.Collections2;
import com.google.common.collect.Lists; public class FilterDemo { public static void main(String[] args) {
List<String> list = Lists.newArrayList("moon", "dad", "refer", "son");
Collection<String> palindromeList = Collections2.filter(list, input -> {
return new StringBuilder(input).reverse().toString().equals(input); // 找回文串
});
System.out.println(palindromeList);//palindromeList 回文,也叫做镜文,正写倒写一样,如mam
} }
返回:
[dad, refer]
transform():类型转换
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Set; import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.Sets; public class TransformDemo { public static void main(String[] args) {
Set<Long> times = Sets.newHashSet();
times.add(91299990701L);
times.add(9320001010L);
times.add(9920170621L);
Collection<String> timeStrCol = Collections2.transform(times, new Function<Long, String>() { @Override
public String apply( Long input) {
return new SimpleDateFormat("yyyy-MM-dd").format(input);
}
});
System.out.println(timeStrCol);
} }
返回:
[1970-04-19, 1970-04-26, 1972-11-23]
多个Function组合
import java.util.Collection;
import java.util.List; import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists; public class TransformDemo2 { public static void main(String[] args) {
List<String> list = Lists.newArrayList("abcde", "good", "happiness");
// 确保容器中的字符串长度不超过5
Function<String, String> f1 = new Function<String, String>() { @Override
public String apply( String input) {
return input.length() > 5 ? input.substring(0, 5) : input;
}
};
// 转成大写
Function<String, String> f2 = new Function<String, String>() { @Override
public String apply( String input) {
return input.toUpperCase();
}
};
Function<String, String> function = Functions.compose(f1, f2);
Collection<String> results = Collections2.transform(list, function);
System.out.println(results);
} }
返回:
[ABCDE, GOOD, HAPPI]
集合操作:交集、差集、并集
import java.util.Set;
import com.google.common.collect.Sets;
public class CollectionsDemo {
	public static void main(String[] args) {
		Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
		Set<Integer> set2 = Sets.newHashSet(3, 4, 5, 6);
		Sets.SetView<Integer> inter = Sets.intersection(set1, set2); // 交集
		System.out.println(inter);
		Sets.SetView<Integer> diff = Sets.difference(set1, set2); // 差集,在A中不在B中
		System.out.println(diff);
		Sets.SetView<Integer> union = Sets.union(set1, set2); // 并集
		System.out.println(union);
	}
}
返回:
[3, 4, 5]
[1, 2]
[1, 2, 3, 4, 5, 6]
guava快速入门(二)的更多相关文章
- Guava快速入门
		
Guava快速入门 Java诞生于1995年,在这20年的时间里Java已经成为世界上最流行的编程语言之一.虽然Java语言时常经历各种各样的吐槽,但它仍然是一门在不断发展.变化的语言--除了语言本身 ...
 - python3.5+django2.0快速入门(二)
		
昨天写了python3.5+django2.0快速入门(一)今天将讲解配置数据库,创建模型,还有admin的后台管理. 配置数据库 我们打开mysite/mysite/settings.py这个文件. ...
 - guava快速入门(一)
		
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...
 - guava快速入门(三)
		
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support] ...
 - Linux Bash Shell快速入门 (二)
		
BASH 中的变量介绍BASH 中的变量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格. 简单变量在 BASH 中变量定义是不需要的,没有 "int i ...
 - Mysql快速入门(二)
		
多表关联查询 JOIN 按照功能大致分为如下三类: CROSS JOIN(交叉连接) INNER JOIN(内连接或等值连接). OUTER JOIN(外连接) 交叉连接 交叉连接的关键字:CROSS ...
 - Ant快速入门(二)-----使用Ant工具
		
使用Ant非常简单,当正确安装Ant后,只要输入ant或ant.bat即可. 如果运行ant命令时没有指定任何参数,Ant会在当前目录下搜索build.xml文件.如果找到了就以该文件作为生成文件,并 ...
 - mybatis快速入门(二)
		
这次接着上次写增删改查吧. 现将上节的方法改造一下,改造测试类. package cn.my.test; import java.io.IOException; import java.io.Inpu ...
 - jquery  快速入门二
		
---恢复内容开始--- 操作标签 样式操作 样式类 addClass();//添加指定的CSS类名. removeClass();//移除指定的类名. hasClass();//判断样式不存在 to ...
 
随机推荐
- python+pcap+dpkt抓包小实例
			
通过pcap与dpkt抓包解包示例: #!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 &qu ...
 - POJ的练习题
			
http://wenku.baidu.com/link?url=PT1gkBWC3eXuzzs0QqWklC0VNYkf5ynxBFguXPGYR22l1D2tXmQ4VjnsWvbFyvj1fqGi ...
 - Display all 2232 possibilities? (y or n)
			
Linux下我在没输入任何命令的情况下摁了两下tab键,然后就出现了这个提示:Display all 2232 possibilities? (y or n) 我觉得摁y的话就会显示所有的现阶段命令. ...
 - multiprocessor(下)
			
一.数据共享 展望未来,基于消息传递的并发编程是大势所趋即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分 ...
 - 代码 | 自适应大邻域搜索系列之(4) - Solution定义和管理的代码实现解析
			
前言 上一篇讲解了destroy和repair方法的具体实现代码,好多读者都在喊酸爽和得劲儿--今天这篇就讲点简单的,关于solution的定义和管理的代码实现,让大家回回神吧--哈哈. 01 总体概 ...
 - 解决self.encoding = charset_by_name(self.charset).encoding
			
解决self.encoding = charset_by_name(self.charset).encoding def createMysqlTable(tablename): # config = ...
 - leetcode-77-组合
			
题目描述: 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], ...
 - mongodb主从备份 和 手动主从切换
			
环境: 主机A:172.16.160.91 主机B:172.16.160.92 配置主机A [root@master zhxf]# cat docker-compose.yml version: '3 ...
 - 1. C++11保证稳定性与兼容性
			
1.1 __func__预定义标识符 在c99中,__func__基本功能是返回所在函数的名字,c++11中允许使用在类或结构体中. #include <iostream> using n ...
 - Neo4j使用简单例子(转)
			
Neo4j Versions Most of the examples on this page are written with Neo4j 2.0 in mind, so they skip th ...