guava 学习笔记 瓜娃(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
guava最新的正式版本是14.0-rc2,这个版本需要java1.6支持.
最新的maven坐标是:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0-rc2</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 学习笔记 瓜娃(guava)的API快速熟悉使用的更多相关文章
- Guava学习笔记:Guava cache
缓存,在我们日常开发中是必不可少的一种解决性能问题的方法.简单的说,cache 就是为了提升系统性能而开辟的一块内存空间. 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用 ...
- Guava学习笔记:Guava新集合-Table等
Table 当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName, Map<LastName, Person>>来实现.为此Guava ...
- Guava学习笔记:Guava新增集合类型-Bimap
BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,我们就 ...
- Guava学习笔记:Guava新增集合类型-Multimap
在日常的开发工作中,我们有的时候需要构造像Map<K, List<V>>或者Map<K, Set<V>>这样比较复杂的集合类型的数据结构,以便做相应的业 ...
- Guava学习笔记:Guava新增集合类型-Multiset
Guava引进了JDK里没有的,但是非常有用的一些新的集合类型.所有这些新集合类型都能和JDK里的集合平滑集成.Guava集合非常精准地实现了JDK定义的接口.Guava中定义的新集合有: Multi ...
- Guava学习笔记目录
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
随机推荐
- [Winform]Media Player播放控制面板控制,单击事件截获
摘要 在项目中有这样的一个需求,需要在一台宣传机器上循环播放一段视频,并在体验的用户单击鼠标左键的时候推出全屏,可以让用户体验电脑的其它功能. 解决方案 考虑到都是windows系统的,所以采用了wi ...
- [Winform]检测exe是否已经运行,并将其置顶
摘要 在很多pc应用中,基本上都需要有这样的判断,保证在一个终端只运行一个winform的client.并且如果最小化了,用户再次双击桌面图标的时候,将client置顶显示. 解决方案 需要使用win ...
- After 2 years, I have finally solved my "Slow Hyper-V Guest Network Performance" issue. I am ecstatic.
Edit - It should be known that I was initially researching this issue back in 2012 and the solution ...
- 利用阿里云提供的镜像快速更换本地的yum源
打开网页:http://mirrors.aliyun.com/ 从“ 文件列表 ”找到自己的系统: Mirror Last update Help CPAN 2015-07-15 15:36:50 ...
- Xcode 5中非常期待的6个功能
这里是新特征汇总博文链接:iOS7新特征汇总 小引: 自从北京时间2013年06月11日苹果发布Xcode 5 Developer Preview 1,到现在(2013年7约15日)已经过去一个月,苹 ...
- C/S模式与B/S
网络程序开发的两种计算模式--C/S模式与B/S模式.两种各有千秋,用于不同场合. C/S适用于专人使用,安全性要求较高的系统: B/S适用于交互性比较频繁的场合,容易被人们所接受,倍受用户和软件开发 ...
- SOA:A note on RPC
原文地址:http://www.rabbitmq.com/tutorials/tutorial-six-dotnet.html. Although RPC is a pretty common pat ...
- java.io.IOException: Attempted read from closed stream解决
在HttpClient请求的时候,返回结果解析时出现java.io.IOException: Attempted read from closed stream. 异常,解决 原因是EntityUti ...
- SSD阵列卡方案优化:考虑使用RAID 50替代RAID 10
最近一直在研究RAID 50,因为牺牲一半的容量的RAID 10代价实在太大了,而且它提供的可用性也并不是百分百的,我们首先来看下RAID 10的可用性分析: 以同等容量的不同RAID方式作为案例分析 ...
- JQuery攻略(六)菜单导航
jQuery菜单导航的基础应用 此章节有 1.0 页面导航 1.01面包屑菜单 1.02菜单悬停 1.03菜单快捷键 1.04两个单独的菜单 1.05折叠菜单 1.01面包屑菜单 html <b ...