005-guava 集合-集合工具类-java.util.Collections中未包含的集合工具[Maps,Lists,Sets],Iterables、Multisets、Multimaps、Tables
一、概述
工具类与特定集合接口的对应关系归纳如下:
| 集合接口 | 属于JDK还是Guava | 对应的Guava工具类 |
| Collection | JDK | Collections2:不要和java.util.Collections混淆 |
| List | JDK | Lists |
| Set | JDK | Sets |
| SortedSet | JDK | Sets |
| Map | JDK | Maps |
| SortedMap | JDK | Maps |
| Queue | JDK | Queues |
| Multiset | Guava | Multisets |
| Multimap | Guava | Multimaps |
| BiMap | Guava | Maps |
| Table | Guava | Tables |
二、使用
2.1、静态工厂方法-创建型工具类
guava 为创建基本类型集合提供上述工具类创建,为自建集合类型提供create方式创建,工具类如上
@Test
public void testNewInstance() {
//jdk 7 之前
List<String> list1 = new ArrayList<String>();
//jdk 7 之后
List<String> list2 = new ArrayList<>();
//Guava的静态工厂方法
ArrayList<String> list3 = Lists.newArrayList();
ArrayList<String> list4 = Lists.newArrayList("a","b");
ArrayList<String> list5 = Lists.newArrayListWithCapacity(100);
// guava 集合创建
Multiset<String> multiset = HashMultiset.create();
}
Guava引入的新集合类型没有暴露原始构造器,也没有在工具类中提供初始化方法。而是直接在集合类中提供了静态工厂方法
2.2、工具类-Iterables
在可能的情况下,Guava提供的工具方法更偏向于接受Iterable而不是Collection类型。在Google,对于不存放在主存的集合——比如从数据库或其他数据中心收集的结果集,因为实际上还没有攫取全部数据,这类结果集都不能支持类似size()的操作 ——通常都不会用Collection类型来表示。
因此,很多你期望的支持所有集合的操作都在Iterables类中。大多数Iterables方法有一个在Iterators类中的对应版本,用来处理Iterator。
常规方法
| concat(Iterable<Iterable>) | 串联多个iterables的懒视图* | concat(Iterable...) |
| frequency(Iterable, Object) | 返回对象在iterable中出现的次数 | 与Collections.frequency (Collection, Object)比较;Multiset |
| partition(Iterable, int) | 把iterable按指定大小分割,得到的子集都不能进行修改操作 | Lists.partition(List, int);paddedPartition(Iterable, int) |
| getFirst(Iterable, T default) | 返回iterable的第一个元素,若iterable为空则返回默认值 | 与Iterable.iterator(). next()比较;FluentIterable.first() |
| getLast(Iterable) | 返回iterable的最后一个元素,若iterable为空则抛出NoSuchElementException | getLast(Iterable, T default); FluentIterable.last() |
| elementsEqual(Iterable, Iterable) | 如果两个iterable中的所有元素相等且顺序一致,返回true | 与List.equals(Object)比较 |
| unmodifiableIterable(Iterable) | 返回iterable的不可变视图 | 与Collections. unmodifiableCollection(Collection)比较 |
| limit(Iterable, int) | 限制iterable的元素个数限制给定值 | FluentIterable.limit(int) |
| getOnlyElement(Iterable) | 获取iterable中唯一的元素,如果iterable为空或有多个元素,则快速失败 | getOnlyElement(Iterable, T default) |
示例
@Test
public void testIterables() {
ArrayList<String> ab = Lists.newArrayList("a","b");
ArrayList<String> bc = Lists.newArrayList("b","c");
Iterable<String> concat = Iterables.concat(ab, bc);
System.out.println(concat);//[a, b, b, c]
Iterable<List<String>> lists = Iterables.paddedPartition(ab,1);
System.out.println(lists);//[[a], [b]]
}
其他操作方法
与Collection方法相似的工具方法
| 方法 | 类似的Collection方法 | 等价的FluentIterable方法 |
| addAll(Collection addTo, Iterable toAdd) | Collection.addAll(Collection) | |
| contains(Iterable, Object) | Collection.contains(Object) | FluentIterable.contains(Object) |
| removeAll(Iterable removeFrom, Collection toRemove) | Collection.removeAll(Collection) | |
| retainAll(Iterable removeFrom, Collection toRetain) | Collection.retainAll(Collection) | |
| size(Iterable) | Collection.size() | FluentIterable.size() |
| toArray(Iterable, Class) | Collection.toArray(T[]) | FluentIterable.toArray(Class) |
| isEmpty(Iterable) | Collection.isEmpty() | FluentIterable.isEmpty() |
| get(Iterable, int) | List.get(int) | FluentIterable.get(int) |
| toString(Iterable) | Collection.toString() | FluentIterable.toString() |
2.3、工具类-FluentIterable
除了上面提到的方法,FluentIterable还有一些便利方法用来把自己拷贝到不可变集合
| ImmutableList | |
| ImmutableSet | toImmutableSet() |
| ImmutableSortedSet | toImmutableSortedSet(Comparator) |
2.4、工具类-LIsts、Sets、Maps
Lists
| 方法 | 描述 |
| partition(List, int) | 把List按指定大小分割 |
| reverse(List) | 返回给定List的反转视图。注: 如果List是不可变的,考虑改用ImmutableList.reverse()。 |
Sets
集合理论方法
我们提供了很多标准的集合运算(Set-Theoretic)方法,这些方法接受Set参数并返回SetView,可用于:
- 直接当作Set使用,因为SetView也实现了Set接口;
- 用copyInto(Set)拷贝进另一个可变集合;
- 用immutableCopy()对自己做不可变拷贝。
| 方法 |
| union(Set, Set) |
| intersection(Set, Set) |
| difference(Set, Set) |
| symmetricDifference(Set, Set) |
其他Set工具方法
| 方法 | 描述 | 另请参见 |
| cartesianProduct(List<Set>) | 返回所有集合的笛卡儿积 | cartesianProduct(Set...) |
| powerSet(Set) | 返回给定集合的所有子集 |
Maps
uniqueIndex
Maps.uniqueIndex(Iterable,Function)通常针对的场景是:有一组对象,它们在某个属性上分别有独一无二的值,而我们希望能够按照这个属性值查找对象——译者注:这个方法返回一个Map,键为Function返回的属性值,值为Iterable中相应的元素,因此我们可以反复用这个Map进行查找操作。
比方说,我们有一堆字符串,这些字符串的长度都是独一无二的,而我们希望能够按照特定长度查找字符串:
class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@Test
public void testMapsuniqueIndex() {
ArrayList<Person> list = Lists.newArrayList(new Person("lhx", 22), new Person("zl", 20));
// 得到以name为key,Person为值的一个map
ImmutableMap<String, Person> uniqueIndex = Maps.uniqueIndex(list, p -> p.name);
System.out.println(uniqueIndex);//{lhx=Person{name='lhx', age=22}, zl=Person{name='zl', age=20}}
list.add(new Person("lhx", 32));
// 报错 索引不唯一
//ImmutableMap<String, Person> uniqueIndex2 = Maps.uniqueIndex(list, p -> p.name);
//System.out.println(uniqueIndex2);
}
如果索引值不是独一无二的,请参见下面的Multimaps.index方法。
difference
Maps.difference(Map, Map)用来比较两个Map以获取所有不同点。该方法返回MapDifference对象,把不同点的维恩图分解为:
| entriesInCommon() | 两个Map中都有的映射项,包括匹配的键与值 |
| entriesDiffering() | 键相同但是值不同值映射项。返回的Map的值类型为MapDifference.ValueDifference,以表示左右两个不同的值 |
| entriesOnlyOnLeft() | 键只存在于左边Map的映射项 |
| entriesOnlyOnRight() | 键只存在于右边Map的映射项 |
@Test
public void testMapsdifference() {
Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);
Map<String, Integer> right = ImmutableMap.of("a", 1, "b", 3, "e", 5); MapDifference<String, Integer> diff = Maps.difference(left, right); Map<String, Integer> stringIntegerMap;
//两个Map中都有的映射项,包括匹配的键与值
stringIntegerMap = diff.entriesInCommon();
System.out.println(stringIntegerMap);//{a=1} //键相同但是值不同值映射项。
Map<String, MapDifference.ValueDifference<Integer>> differing = diff.entriesDiffering();
System.out.println(differing);//{b=(2, 3)} //键只存在于左边Map的映射项
stringIntegerMap = diff.entriesOnlyOnLeft();
System.out.println(stringIntegerMap);//{c=3} //键只存在于右边Map的映射项
stringIntegerMap = diff.entriesOnlyOnRight();
System.out.println(stringIntegerMap);//{e=5} }
处理BiMap的工具方法
Guava中处理BiMap的工具方法在Maps类中,因为BiMap也是一种Map实现。
| BiMap工具方法 | 相应的Map工具方法 |
| synchronizedBiMap(BiMap) | Collections.synchronizedMap(Map) |
| unmodifiableBiMap(BiMap) | Collections.unmodifiableMap(Map) |
2.5、工具类-Multisets、Multimaps、Tables
| 方法 | 说明 | 和Collection方法的区别 |
| containsOccurrences(Multiset sup, Multiset sub) | 对任意o,如果sub.count(o)<=super.count(o),返回true | Collection.containsAll忽略个数,而只关心sub的元素是否都在super中 |
| removeOccurrences(Multiset removeFrom, Multiset toRemove) | 对toRemove中的重复元素,仅在removeFrom中删除相同个数。 | Collection.removeAll移除所有出现在toRemove的元素 |
| retainOccurrences(Multiset removeFrom, Multiset toRetain) | 修改removeFrom,以保证任意o都符合removeFrom.count(o)<=toRetain.count(o) | Collection.retainAll保留所有出现在toRetain的元素 |
| intersection(Multiset, Multiset) | 返回两个multiset的交集; | 没有类似方法 |
Multisets中的其他工具方法还包括:
| copyHighestCountFirst(Multiset) | 返回Multiset的不可变拷贝,并将元素按重复出现的次数做降序排列 |
| unmodifiableMultiset(Multiset) | 返回Multiset的只读视图 |
| unmodifiableSortedMultiset(SortedMultiset) | 返回SortedMultiset的只读视图 |
005-guava 集合-集合工具类-java.util.Collections中未包含的集合工具[Maps,Lists,Sets],Iterables、Multisets、Multimaps、Tables的更多相关文章
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...
- [Google Guava] 强大的集合工具类:java.util.Collections中未包含的集合工具
转载的,有问题请联系我 原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collecti ...
- 集合-强大的集合工具类:java.util.Collections中未包含的集合工具
任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.Guava沿着这些路线提供了更多的工具方法:适用于所有集合的静态方法.这是Guava最流行和成熟 ...
- JavaSE-基础语法(二)-系统类(java.lang.*)和工具类(java.util.*)
系统类(java.lang.*)和工具类(java.util.*) 一.系统类(java.lang.*) 这个包下包含java语言的核心类,如String.Math.System和Thread类等,使 ...
- 类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
类 java.util.Collections 提供了对Set.List.Map进行排序.填充.查找元素的辅助方法. 1. void sort(List) //对List容器内的元素排序,排序的规 ...
- java.util.concurrent中的几种同步工具类
java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...
- 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.
- 工具类Arrays.asList()方法把数组转换成集合
工具类Arrays.asList()方法把数组转换成集合 不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException() 问 ...
- JAVA核心技术I---JAVA基础知识(工具类Arrays和Collections类)
一:工具类 –不存储数据,而是在数据容器上,实现高效操作 • 排序 • 搜索 –Arrays类 –Collection类 二:Arrays类(处理数组) (一)基本方法 –排序:对数组排序, sort ...
随机推荐
- 关于JDBCUtils的模糊查询问题
1.JDBCUtils的模糊查询问题解决方法 数据库jdbc工具类的模糊查询最核心的就是用like %内容%,但是我们对于界面输入进来的东西都是用?来替代的,那么就代表着我们不能吧%%写在问号旁边.否 ...
- 行为型模式(十一) 解释器模式(Interpreter)
一.动机(Motivate) 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化.在这种情况下,将特定领域的问题表达为某种语法规 ...
- 黄杉杉 --java第七次作业
题目1:创建一个柱体类,包含矩形对象.高和体积等三个成员变量,一个构造方法进行成员变量初始化,和计算体积.换底两个功能方法,在主类中输入长.宽.高,计算柱体体积,输入新的长.宽.高,创建新的矩形对象, ...
- Python之sort()函数详解
#从小到大排列 print(sorted([36, 5, -12, 9, -21])) #将待排序的值放入到key中的函数中,在进行比较排序 print(sorted([36, 5, -12, 9, ...
- javamail: UrlDataSource获取网络文件作为邮件的附件|javamail发送二进制流附件的问题
https://www.cnblogs.com/younldeace/p/5193103.html 最近做个邮件发送功能,要内嵌图片并有附件. 需求很奇怪,图片和附件文件是放在ftp服务器上的,查了下 ...
- map json 字符串 对象之间的相互转化
1.对象与字符串之间的互转 将对象转换成为字符串 String str = JSON.toJSONString(infoDo); 字符串转换成为对象 InfoDo infoDo = JSON.pars ...
- python -- 连接 orclae cx_Oracle的使用
# 如果报错参考的资料 https://blog.csdn.net/white_xuqin/article/details/82878860 场景再现: python-cx_oracle报错" ...
- [matlab工具箱] 神经网络Neural Net
//目的是学习在BP神经网络的基础上添加遗传算法,蚁群算法等优化算法来优化网络,这是后话. 先简单了解了MATLAB中的神经网络工具箱,工具箱功能还是非常强大的,已经可以拟合出非常多的曲线来分析了. ...
- leetcode 63 简单题
题目很水... 直接放代码了 int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridRowSize, int obstacl ...
- 【Python】安装MySQLdb模块centos 6.1 宝塔Linux面板 MySQL5.6
[Python]安装MySQLdb模块centos 6.1 宝塔Linux面板 MySQL5.6 总之是各种坑 先说一下,宝塔安装在centos 6.1 i368 也就是32位系统上的方法 https ...