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 ...
随机推荐
- linux系统编程综合练习-实现一个小型的shell程序(三)
上节中已经实现了对普通命令的解析,包括输入重定向,输出重定向,管道,后台作业,这次就来执行已经解析好的命令,对应的函数为:execute_command(),首先对带有管道的命令进行执行: 比如:&q ...
- 一个Python小白如何快速完成爬虫
很人或多或少都听说过python爬虫,但不知道如何通过python爬虫来爬取自己想要的内容,今天我就给大家说一个爬虫教程来实现自己第一次python爬虫. 环境搭建 既然用python,那么自然少不了 ...
- 03 c++中this指针
概念: 成员函数:在类中定义的函数.普通函数无法被继承,成员函数可以被继承.友元函数相当于普通函数. 友元函数不是类的组成,没有this指针,必须将成员函数操作符作为参数传递对象. 在c++中成员函数 ...
- destoon标签大集合
最近没事玩上了destoon,所以就自己花一点时间整理了一下destoon标签,对开发有帮助,本篇文章由博客园-圆柱模板 博主整理发布 1.全局标签 网站名称:{$DT[sitename]} 网站地 ...
- npm run build 时的 warning
entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit ...
- c# DES 加密解密方法
#region 密钥 private static string key = "abcd1234"; //密钥(长度必须8位以上) #endregion #region DES加密 ...
- JS基础篇之作用域、执行上下文、this、闭包
前言:JS 的作用域.执行上下文.this.闭包是老生常谈的话题,也是新手比较懵懂的知识点.当然即便你作为老手,也未必真的能理解透彻这些概念. 一.作用域和执行上下文 作用域: js中的作用域是词法作 ...
- SSM整合Dubbo登陆案例
登陆案例 一.创建Service项目存放共同数据 1.1 创建实体类 private long id; private String loginName; private String userNa ...
- [React] Write a Custom React Effect Hook
Similar to writing a custom State Hook, we’ll write our own Effect Hook called useStarWarsQuote, whi ...
- 洛谷 P2279 [HNOI2003]消防局的设立 题解
每日一题 day34 打卡 Analysis 这道题的正解本来是树形dp,但要设5个状态,太麻烦了.于是我就用贪心试图做出此题,没想到还真做出来了. 考虑当前深度最大的叶子结点,你肯定要有一个消防局去 ...