guava API整理
1,大纲
让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分:
- Introduction
- Guava Collection API
- Guava Basic Utilities
- IO API
- Cache API
2,为神马选择瓜娃?
- 瓜娃是java API蛋糕上的冰激凌(精华)
- 高效设计良好的API.
- 被google的开发者设计,实现和使用。
- 遵循高效的java这本书的好的语法实践。
- 使代码更刻度,简洁,简单。
- 使用java 1.5的特性,
- 流行的API,动态的开发
- 它提供了大量相关的应用类,集合,多线程,比较,字符串,输入输出,缓存,网络,原生类型,数学,反射等等
- 百分百的单元测试,被很多的项目使用,帮助开发者专注业务逻辑而不是写java应用类
- 节省时间,资源,提高生产力
- 我的目的是为基本的java特征提供开源代码的支持,而不是自己再写一个
- Apache Common库-Apache是一个很好的成熟的库,但是不支持泛型,Apache对早起的java版本很有用,(1.5之前的)
- java7,java8 最新的java支持一些guava的API
maven:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
3,集合API的使用
3.1简化工作
可以简化集合的创建和初始化;
类别 | 原来的写法 | guava的写法 |
集合创建 |
Map<String, Map<String, String>> map = new HashMap<String, Map<String,String>>(); List<List<Map<String, String>>> list = new ArrayList<List<Map<String,String>>>(); |
Map<String, Map<String, String>> map = Maps.newHashMap(); List<List<Map<String, String>>> list = Lists.newArrayList(); //1,简化集合的创建 |
集合初始化 |
Set<String> set = new HashSet<String>(); set.add("one"); set.add("two"); set.add("three"); |
Set<String> set = Sets.newHashSet("one","two","three"); List<String> list = Lists.newArrayList("one","two","three"); Map<String, String> map = ImmutableMap.of("ON","TRUE","OFF","FALSE"); //2,简化集合的初始化 new Person(2, 1, "a", "46546", 1, 20)); new Person(2,1,"a","46546",1,20)); |
3.2 不变性
很大一部分是google集合提供了不变性,不变对比可变:
- 数据不可改变
- 线程安全
- 不需要同步逻辑
- 可以被自由的共享
- 容易设计和实现
- 内存和时间高效
不变对比不可修改
google的不变被确保真正不可改变,而不可修改实际上还是可以修改数据;如下所示:
Set<Integer> data = new HashSet<Integer>();
data.addAll(Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80));
Set<Integer> fixedData = Collections.unmodifiableSet(data); // fixedData - [50, 70, 80, 20, 40, 10, 60, 30]
data.add(90); // fixedData - [50, 70, 80, 20, 40, 10, 90, 60, 30]
如何创建不可变的集合:
ImmutableSet<Integer> numbers = ImmutableSet.of(10, 20, 30, 40, 50);
使用copyOf方法
ImmutableSet<Integer> another = mmutableSet.copyOf(numbers);
使用Builder方法
ImmutableSet<Integer> numbers2 = ImmutableSet.<Integer>builder().addAll(numbers) .add(60) .add(70).add(80).build();
//3,创建不可变的集合
ImmutableList<Person> personImmutableList=
ImmutableList.of(new Person(1, 1, "a", "46546", 1, 20), new Person(2, 1, "a", "46546", 1, 20));
ImmutableSet<Person> personImmutableSet=ImmutableSet.copyOf(personSet2);
ImmutableMap<String,Person> personImmutableMap=ImmutableMap.<String,Person>builder()
.put("hell",new Person(1,1,"a","46546",1,20)).putAll(personMap2) .build();
3.3 新的集合类型
The Guava API provides very useful new collection types that work very nicely with existing java collections.
guava API 提供了有用的新的集合类型,协同已经存在的java集合工作的很好。
分别是 MultiMap, MultiSet, Table, BiMap, ClassToInstanceMap
种类 | 写的例子 |
MultiMap |
一种key可以重复的map,子类有ListMultimap和SetMultimap,对应的通过key分别得到list和set Multimap<String, Person> customersByType =ArrayListMultimap.create();customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 20)); customersByType.put("abc", new Person(1, 1, "a", "46546", 1, 30)); for(Person person:customersByType.get("abc")) |
MultiSet |
不是集合,可以增加重复的元素,并且可以统计出重复元素的个数,例子如下: private static void testMulitiSet() { System.out.println( multiSet.count(30)); // 2 |
Table |
相当于有两个key的map,不多解释 private static void testTable() { //1,得到行集合 } |
BiMap | 是一个一一映射,可以通过key得到value,也可以通过value得到key;
private static void testBitMap() { biMap.put(1,"hello"); int value= biMap.inverse().get("my"); } |
ClassToInstanceMap |
有的时候,你的map的key并不是一种类型,他们是很多类型,你想通过映射他们得到这种类型,guava提供了ClassToInstanceMap满足了这个目的。
除了继承自Map接口,ClassToInstaceMap提供了方法 T getInstance(Class<T>) 和 T putInstance(Class<T>, T),消除了强制类型转换。
该类有一个简单类型的参数,通常称为B,代表了map控制的上层绑定,例如:
ClassToInstanceMap<Number> numberDefaults = MutableClassToInstanceMap.create(); 从技术上来说,ClassToInstanceMap<B> 实现了Map<Class<? extends B>, B>,或者说,这是一个从B的子类到B对象的映射,这可能使得ClassToInstanceMap的泛型轻度混乱,但是只要记住B总是Map的上层绑定类型,通常来说B只是一个对象。
guava提供了有用的实现, MutableClassToInstanceMap 和 ImmutableClassToInstanceMap.
重点:像其他的Map<Class,Object>,ClassToInstanceMap 含有的原生类型的项目,一个原生类型和他的相应的包装类可以映射到不同的值;
private static void testClass() { Person person= new Person(1,20,"abc","46464",1,100); classToInstanceMap.putInstance(Person.class,person); // System.out.println("string:"+classToInstanceMap.getInstance(String.class)); Person person1=classToInstanceMap.getInstance(Person.class); } |
3.4 谓词和筛选
谓词(Predicate)是用来筛选集合的;
谓词是一个简单的接口,只有一个方法返回布尔值,但是他是一个很令人惊讶的集合方法,当你结合collections2.filter方法使用,这个筛选方法返回原来的集合中满足这个谓词接口的元素;
举个例子来说:筛选出集合中的女人
public static void main(String[] args)
{
Optional<ImmutableMultiset<Person>> optional=Optional.fromNullable(testPredict());
if(optional.isPresent())
{
for(Person p:optional.get())
{
System.out.println("女人:"+p);
}
}
System.out.println(optional.isPresent());
}
public static ImmutableMultiset<Person> testPredict()
{
List<Person> personList=Lists.newArrayList(new Person(1, 1, "a", "46546", 1, 20),
new Person(2, 1, "ab", "46546", 0, 30),
new Person(3, 1, "abc", "46546", 0, 25),
new Person(4, 1, "aef", "46546", 1, 50),
new Person(5, 1, "ade", "46546",0, 27),
new Person(6, 1, "acc", "46546", 1, 29),
new Person(7, 1, "add", "46546",0, 33));
return ImmutableMultiset.copyOf(Collections2.filter(personList,new Predicate<Person>() {
@Override
public boolean apply( Person input) {
return input.getSex()==0;
}
}));
}
Predicates含有一些内置的筛选方法,比如说 in ,and ,not等,根据实际情况选择使用。
3.5 功能和转换
转换一个集合为另外一个集合;
实例如下:
public static void main(String[] args)
{
Optional<ImmutableMultiset<String>> optional=Optional.fromNullable(testTransform());
if(optional.isPresent())
{
for(String p:optional.get())
{
System.out.println("名字:"+p);
}
}
System.out.println(optional.isPresent());
}
public static ImmutableMultiset<String> testTransform()
{
List<Person> personList=Lists.newArrayList(new Person(1, 1, "a", "46546", 1, 20),
new Person(2, 1, "ab", "46546", 0, 30),
new Person(3, 1, "abc", "46546", 0, 25),
new Person(4, 1, "aef", "46546", 1, 50),
new Person(5, 1, "ade", "46546",0, 27),
new Person(6, 1, "acc", "46546", 1, 29),
new Person(7, 1, "add", "46546",0, 33));
return ImmutableMultiset.copyOf(Lists.transform(personList,new Function<Person, String>() {
@Override
public String apply( Person input) {
return input.getName();
}
}));
}
3.6 排序
是guava一份非常灵活的比较类,可以被用来操作,扩展,当作比较器,排序提供了集合排序的很多控制;
实例如下:
Lists.newArrayList(30, 20, 60, 80, 10);
Ordering.natural().sortedCopy(numbers); //10,20,30,60,80
Ordering.natural().reverse().sortedCopy(numbers); //80,60,30,20,10
Ordering.natural().min(numbers); //10
Ordering.natural().max(numbers); //80
Lists.newArrayList(30, 20, 60, 80, null, 10);
Ordering.natural().nullsLast().sortedCopy(numbers); //10, 20,30,60,80,null
Ordering.natural().nullsFirst().sortedCopy(numbers); //null,10,20,30,60,80
public static void testOrdering()
{
List<Person> personList=Lists.newArrayList(
new Person(3, 1, "abc", "46546", 0, 25),
new Person(2, 1, "ab", "46546", 0, 30),
new Person(5, 1, "ade", "46546",0, 27),
new Person(1, 1, "a", "46546", 1, 20),
new Person(6, 1, "acc", "46546", 1, 29),
new Person(4, 1, "aef", "46546", 1, 50),
new Person(7, 1, "add", "46546",0, 33)
);
Ordering<Person> byAge=new Ordering<Person>() {
@Override
public int compare( Person left, Person right) {
return right.getAge()-left.getAge();
}
};
for(Person p: byAge.immutableSortedCopy(personList))
{
System.out.println(p);
}
}
guava在结合部分的API使用记录完毕,希望对广大屌丝有所帮助。
guava API整理的更多相关文章
- canvas学习之API整理笔记(二)
前面我整理过一篇文章canvas学习之API整理笔记(一),从这篇文章我们已经可以基本了解到常用绘图的API.简单的变换和动画.而本篇文章的主要内容包括高级动画.像素操作.性能优化等知识点,讲解每个知 ...
- HTML5 <Audio/>标签Api整理(二)
1.实例2: 相对较完整 Html代码: <style> #volumeSlider .slider-selection { background:#bababa; } </styl ...
- Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...
- Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...
- HTML5 <Audio>标签API整理(三)
一.浏览器支持 Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 都支持 <audio> 元素. 注意: Internet Ex ...
- 【转】Bootstrap FileInput中文API整理
Bootstrap FileInput中文API整理 这段时间做项目用到bootstrap fileinput插件上传文件,在用的过程中,网上能查到的api都不是很全,所以想着整理一份比较详细的文档, ...
- Bootstrap FileInput 上传 中文 API 整理
Bootstrap FileInput 上传 中文 API 整理 上传插件有很多 但是公司用的就是 Bootstrap FileInput 自己就看了看 会用就行 自己都不知道每个值是干嘛用的就问 ...
- qq开放平台可以应用到网页游戏的api整理
创建角色界面api整理 一.需求描述 1. 创建角色名称可以用qq空间昵称代替 2. 如果玩家是在新区玩的话,赠送老玩家支持礼包 3. 可以看到,好友xxx也在玩,而且到了多少等级,如果加为好友 ...
- OpenLayers API整理
整理的Openlayers 的知识笔记,随着运用不断加深理解,也会不断更新. 本文链接:Openlayers API整理 作者:狐狸家的鱼 GitHub:八至 一.创建地图 1.地图Map 创建地图底 ...
随机推荐
- how to deal with ^M in linux
change windows file to linux file dos2unix configure https://blog.csdn.net/xiongmaojiayou/article/de ...
- CNI bridge 插件实现代码分析
对于每个CNI 插件在执行函数cmdAdd之前的操作是完全一样的,即从环境变量和标准输入内读取配置.这在http://www.cnblogs.com/YaoDD/p/6410725.html这篇博文里 ...
- Django - 权限(1)
一.权限表结构设计 1.认识权限 生活中处处有权限,比如,腾讯视频开会员才有观看某个最新电影的权限,你有房间钥匙就有了进入这个房间的权限,等等.同样,程序开发过程中也有权限,我们今天说的权限指的是we ...
- TouchDelegate
TouchDelegate(Rect bounds, View delegateView) Parameters: bounds Bounds in local coordinates of the ...
- 开发微信公众平台--新建新浪云sae部署server
创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为server资源.而且申请PHP环境+MySQL数据库作为程序执行环境. 申请地址:百度搜sae ,使用新浪微博账号能够直接登录SAE,登 ...
- python库numpy的reshape的终极解释
a = np.arange(2*4*4) b = a.reshape(1,4,4,2) #应该这样按反序来理解:最后一个2是一个只有2个元素的向量,最后的4,2代表4×2的矩阵,最 ...
- 怎么找出解析失败的sql
本文由我和公司同事问心共同测试分析完成. 很多时候我们会有这样一个误区,语法错误或者对象不存在应该在语法语义检查这个步骤就结束了,怎么还会存在共享池里面呢?带着这个几个问题我们做几个简单的测试. 我们 ...
- NUnit.Framework的使用方法演示
using NUnit.Framework; namespace CheckExcel { [TestFixture] public class TestExcelHelper { /// <s ...
- Log4Net各参数API
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...
- Typecho部署安装
此文章已经在这里上. 如果您看到这篇文章,表示您的 blog 已经在digitalocean.com安装成功.下面说下安装的步骤,此文章都是在digitalocean.com的centos上成功安装: ...