Guava库介绍之集合(Collection)相关的API
作者:Jack47
转载请保留作者和原文出处
欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源。
本文是我写的Google开源的Java编程库Guava系列之一,主要介绍Guava中提供的集合(Collection)相关的API。
1. 一些小功能##
集合声明更简单###
Java中同质的范型集合是一个很大的特色,但是有些时候他们的构造函数有点太啰嗦了,比如:
Map<String, Map<String, Integer>> lookup = new HashMap<String, Map<String, Integer>>();
在Java 7中通过钻石操作符<>
来允许有限的非正式的类型推导。上面的例子可以这样写:
Map<String, Map<String, Integer>> lookup = new HashMap<>();
Guava提供了一些使用范型来进行右侧类型推导的静态函数,使得集合的声明更简单,上面的例子可以这么写:
Map<String, Map<String, String>> map = Maps.newHashMap();
List<List<Map<String, String>>> list = Lists.newArrayList();
集合初始化更简单###
可以在集合声明时进行初始化
Set<String> set = Sets.newHashSet("one", "two", "three");
Map<String, String> map = ImmutableMap.of("ON", true, "OFF", false);
2. 不可变性(Immutability)##
大部分google提供的集合都提供不可变的版本。
当你不会修改一个集合,或者期望一个集合是固定不变的,那么一个很好的习惯是防御式地把它拷贝成一个不可变的集合。
注意
Guava中提供的不可变集合的实现是不允许有空值`null`的。因为通过研究Google内部代码库发现在集合中,只有5%的情况下是允许有空值的,剩下的95%情况下最好是遇到空值就快速失败(failing fast)。如果需要空值,可以使用JDK中提供的 Collections.unmodifiableList 这类允许空值的集合实现。
更多关于使用或者避免使用null
的细节见Using And Avoiding Null Explained
不可变的好处:
- 可以放心的给不信任的库使用
- 线程安全:可以被多个线程使用而不会有竞争条件发生
- 不需要同步(synchronization)的逻辑,不需要支持互斥
- 设计和实现很简单。所有不可变的集合实现比可变版本的内存效率要高,分析见这里
如何使用###
有多种方法来得到一个不可变的集合:
使用
of
函数ImmutableSet<Integer> numbers = ImmutableSet.of(10, 30, 40, 50);
使用
copyOf
函数ImmutableSet<Integer> another = ImmutableSet.copyOf(numberSet);
所有不可变的集合都通过asList()
提供了一个不可变的List(ImmutableList)视图。例如数据存储在一个ImmutableSortedSet
里,可以通过sortedSet.asList().get(k)
来获得第k
个最小的元素。
JDK虽然提供了Collections.unmodifiableXXX
方法,但是有一些问题:
- 非常笨重,使用起来很啰嗦,用着不爽
- 不安全:只有当没有对原始集合的引用时,这个函数返回的集合才是真的不可变的
- 不够高效:数据结构里还是有可变集合里关于并发修改的检查,存储哈希表的额外空间等。
3. 新的集合类型##
Guava引入的新的集合类型并没有暴露原始的构造函数,或者提供方便初始化操作的工具类,而是直接使用静态工厂函数,例如:
MultiMap<String, Integer> multiMap = HashMultiMap.create();
MultiMap###
容许一个key有多个值的MultiMap, MultiMap<K, V>
可以取代传统的Map<K, Collection<V>>
。也可以使用值为链表的ListMultiMap
或者集合SetMultiMap
。
Multiset###
Multiset支持添加多次相同的值,支持对值进行计数。
Multiset<Integer> multiSet = HashMultiset.create();
multiSet.add(10);
multiSet.add(30);
multiSet.add(30);
multiSet.add(40);
multiSet.count(30); // 2
multiSet.size(); // 4
Table###
表结构的数据类型Table
,它像Map一样,但是支持两种键--行键(row key)和列键(column key)。
4. 谓语(Predicate)和过滤器(Filter)##
谓语(Predicate)是一个只包含一个返回布尔类型的函数的简单接口。它的作用是给定一个输入,判断是否满足条件。它可以用来过滤集合,例如实现一个过滤出老客户的Predicate
。
static class LoyalCustomer implements Predicate<Customer> {
public boolean apply(Customer customer) {
return CustomerType.LOYAL == customer.getCustomerType();
}
}
Collection<Customer> loyalCustomers = Collections2.filter(customers, new LoyalCustomer());
filter函数的语法是:
Collection<E> filter(Collection<E> unfiltered, Predicate<E> predicate)
内置的Predicate####
Predicates
类包含了and
,or
,not
in
这几个静态函数来方便构建复杂的谓语。
Predicate<String> commonList = and(in(list1), in(list2, or(in(list3));
Predicates
类也包含了很多非常方便的函数,例如notNull
, instanceOf
, contains
等。
SortedMaps.filterValues(map, Predicates.notNull());
如果看到这里还意犹未尽的话,建议去看看源代码和单测的代码,里面有详尽的用法!
参考资料:
如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!
Guava库介绍之集合(Collection)相关的API的更多相关文章
- Guava库介绍之实用工具类
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
- java11 Guava:谷歌开发的集合库
Guava:谷歌开发的集合库,通过build path->Add External JARs 把guava.jar包加进去. 版本控制工具:.CVS .SVN .git 所以需要下载git客户端 ...
- GitHub上排名前100的Android开源库介绍(来自github)
本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍,至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果,然后过滤了 ...
- Guava 教程2-深入探索 Google Guava 库
原文出处: oschina 在这个系列的第一部分里,我简单的介绍了非常优秀的Google collections和Guava类库,并简要的解释了作为Java程序员,如果使用Guava库来减少项目中大量 ...
- GitHub上排名前100的Android开源库介绍
GitHub上排名前100的Android开源库介绍 文章来源: http://www.open-open.com/news/view/1587067#6734290-qzone-1-31660-bf ...
- DBoW2库介绍
DBoW2库是University of Zaragoza里的Lopez等人开发的开源软件库. 由于在SLAM回环检测上的优异表现(特别是ORB-SLAM2),DBoW2库受到了广大SLAM爱好者的关 ...
- WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据
数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...
- Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee)
Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee) Common Lisp第三方库介绍 一个丰富且高质量的开发库集合,对于实际 ...
- [集合]Collection集合框架源码分析
Collection接口 在java的集合类库中,基本接口是Collection,该接口的在集合中的源码定义如下(将源码中的注释删掉了): public interface Collection< ...
随机推荐
- [Idea] idea打不开项目,原因很莫名
由于项目是gitlab上存储的,所以下下来之后,之前遇到过,以为是重新下载之后master上面没有内容导致无法正常打开,这种情况,切换一下master再打开即可: 但是这次遇到的问题不是这种情况, 使 ...
- Javascript实现的数组降维——维度不同,怎么谈恋爱
数组的元素可能是数组,这样一层层嵌套,可能得到一个嵌套很深的数组,数组降维要做的事就是把嵌套很深的数组展开,一般最后得到一个一维数组,其中的元素都是非数组元素,比如数组[1, [2, 3, [4, 5 ...
- Etw EventSourceProvider_EventsProducer.cs OopConsoleTraceEventListenerMonitor_TraceControllerEventsConsumer.cs
// EventSourceProvider_EventsProducer.cs /* /r:"D:\Microshaoft.Nuget.Packages\Microsoft.Diagnos ...
- 安装spark ha集群
安装spark ha集群 1.默认安装好hadoop+zookeeper 2.安装scala 1.解压安装包 tar zxvf scala-2.11.7.tgz 2.配置环境变量 vim /etc/p ...
- EditText键盘弹出时,会将布局底部的导航条顶上去(解决方法之一)
这只是其中一种方法android:windowSoftInputMode有很多属性可以添加,必须是一个state...|ajust... 我只是觉得这种比较好用 在项目的AndroidManifest ...
- servlet jsp jdbc bootstrarp mvc分层模式实现的第一个项目
登录注册界面 这是一个注册和登录的界面 用到了前端页面中自带的一点H5的标签和属性---巩固下 邮箱格式 :type="email" 不能为空: required=" ...
- Html 基础介绍 基础标签
<head> <!-- 设置编码格式 --> <meta charset="UTF-8"> <!-- 设置作者 --> <me ...
- ZooKeeper个人笔记客户端watcher和AsycCallback回调
每一个Watcher具有如下属性: 1.KeeperState 2.EventType 3.path 4.process(WatchedEvent evnet)回掉方法 Watcher干嘛的?用户监听 ...
- 弱省互测#1 t3
题意 给出一棵n个点的树,求包含1号点的第k小的连通块权值和.(\(n<=10^5\)) 分析 k小一般考虑堆... 题解 堆中关键字为\(s(x)+min(a)\),其中\(s(x)\)表示\ ...
- 【BZOJ】3997: [TJOI2015]组合数学
题意 \(N \times M\)的网格,一开始在\((1, 1)\)每次可以向下和向右走,每经过一个有数字的点最多能将数字减1,最终走到\((N, M)\).问至少要走多少次才能将数字全部变为\(0 ...