guava中集合(1)

275 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

1、guava和java中的集合

– guava中针对不同的集合,拆分了较细粒度的工具类,提供了一些新的集合类型,如下图所示: image.png

2、特定集合的工具类

2.1、静态工厂

静态工厂主要用来构建常用的集合实例,常用的如Lists、Sets、Maps等,以Lists为例,如下图所示: image.png

// 常规写法
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分页,需要各种控制边界,非常容易出错。