一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
1、guava和java中的集合
– guava中针对不同的集合,拆分了较细粒度的工具类,提供了一些新的集合类型,如下图所示:
2、特定集合的工具类
2.1、静态工厂
静态工厂主要用来构建常用的集合实例,常用的如Lists、Sets、Maps等,以Lists为例,如下图所示:
// 常规写法
List list = new ArrayList<>(10);
list.add("1");
list.add("2");
// guava 工具方法
Lists.newArrayList();
Lists.newArrayList("a","c");
Lists.newLinkedList();
int arraySize = 10;
Lists.newArrayListWithCapacity(arraySize);
Lists.newArrayListWithExpectedSize(arraySize);
// 16
System.out.println(Ints.saturatedCast(5L + arraySize + (arraySize / 10)));
// 其他jdk集合类
Sets.newHashSet(1,2,3);
Sets.newLinkedHashSet();
Queues.newArrayDeque();
Queues.newConcurrentLinkedQueue();
Map map = Maps.asMap(Sets.newHashSet("a","b"),s->s.toUpperCase());
System.out.println(map);
由代码可以看出,使用guava的工具类,创建实例有2个好处:
- 集合工具分类清晰
- 构造、实例化简便
2.1、高阶用法
- Lists的反转、分页
- Sets的交并差
- Maps的找不同
/**
* Lists 列表工具集
*
* 1、反转
* 2、分页
* 3、笛卡尔积
* 4、list的转换
*
*/
List list = Lists.newArrayList(1,2,3,4,5);
System.out.println("反转:"+Lists.reverse(list));
List<List<Object>> pager = Lists.partition(list,2);
System.out.println("分页:"+pager);
List<List<String>> result = Lists.cartesianProduct(
Lists.newArrayList("1", "2"),
Lists.newArrayList("A", "B")
);
System.out.println(result);
// 转换 jdk 流式编程写法
List<String> strings = Lists.newArrayList("Map", "Guava", "Collections").stream().map(String::toUpperCase).collect(Collectors.toList());
// 转换 guava工具类方法
ArrayList<String> sourceList = Lists.newArrayList("Map", "Guava", "Collections");
Lists.transform(sourceList, e -> e.toUpperCase());
/**
* Sets 集合工具集
* 1、并集、交集、差集 自己写的话可能需要2个集合来回倒腾
* 1)交集
* result.addAll(set1);
* result.retainAll(set2);
*
* 2)差集
* result.addAll(set1);
* result.removeAll(set2);
*
* 3)并集
* result.addAll(set1);
* result.addAll(set2);
*/
Set<Integer> set1 = Sets.newHashSet(1,2,3);
Set<Integer> set2 = Sets.newHashSet(3,4,5);
System.out.println("并集:"+Sets.union(set1,set2));
System.out.println("交集:"+Sets.intersection(set1,set2));
System.out.println("差集(set1有set2没有):"+Sets.difference(set1,set2));
System.out.println("并集-交集:"+Sets.symmetricDifference(set1,set2));
System.out.println("笛卡尔积:"+Sets.cartesianProduct(set1,set2));
System.out.println("全部子集:");
Sets.powerSet(set1).forEach(System.out::println);
/**
* Maps 集合工具集
* 1、查找2个map里面相同的kv
* 2、查找key相同,value不同
* 3、左边独有
* 4、右边独有
* 5、map的转换
*
*/
Map<String,Integer> map1 = Maps.newHashMap();
map1.put("a",1);
map1.put("b",2);
map1.put("d",5);
Map<String,Integer> map2 = Maps.newHashMap();
map2.put("a",1);
map2.put("b",3);
map2.put("c",4);
MapDifference<String,Integer> mapDifference = Maps.difference(map1,map2);
System.out.println("共有的:"+mapDifference.entriesInCommon());
System.out.println("key相同,value不同:"+mapDifference.entriesDiffering());
System.out.println("左边独有的:"+mapDifference.entriesOnlyOnLeft());
System.out.println("右边独有的:"+mapDifference.entriesOnlyOnRight());
通过示例代码,大家可以看出各种操作在guava下非常便利,对于List的分页 、转换等,都是日常开发中非常常见的,尤其是List分页,需要各种控制边界,非常容易出错。