admin 2026-03-02 18:02:13 赛事直播

前言

工欲善其事必先利其器,一个好的工具让你花更少的时间,干更多的活,一定程度上比较高效地解放了你的的生产力,让你可以有更多的时间搞事情(摸鱼、划水呀),作为java后端开发人员,guava对我们而言,就是这样的工具,今天我们就来了解下这把利器。

guava

guava是什么

Guava是Google提供的一组核心Java库,包括新的集合类型(如multimap和multiset)、不可变集合、图形库以及用于并发、I/O、哈希、缓存、原语、字符串等的实用程序!它广泛应用于Google内部的大多数Java项目,也被许多其他公司广泛使用。

guava的应用

既然是工具,那我们关注的就是它的用法,接下来我们就分别从集合、图形、I/O、哈希、缓存、原语、字符串等方面,分享一些guava的常见应用,让他真正能够解放你的生产力,今天主要介绍collect包下的内容,其他内容,感兴趣的小伙伴自己去研究。

首先在我们的项目中,添加guava的依赖:

com.google.guava

guava

30.1.1-jre

如果是android,换下依赖的版本即可。

集合(Lists)

包路径:com.google.common.collect.Lists

创建和添加对象

正常情况下,我们在java中创建和使用List的时候,基本都是这样的:

// 创建集合

List stringList1 = new ArrayList<>();

// 添加对象

stringList1.add("hello");

stringList1.add("world");

但是,如果你用了guava,那上面这些你都可以一步到位:

List stringList2 = Lists.newArrayList("hello", "world");

还支持直接传入数组:

String[] strings = new String[] {"1231", "23432423"};

ArrayList strings1 = Lists.newArrayList(strings);

list分割

更强大的是,它还支持List分割,我们在日常开发中经常有这样的需求,比如某个接口或方法限制了List数据量大小(比如list的大小不能超过200),这时候你如果自己手动写一个分割工具类就很麻烦,但如果用guava,那就很简单:

List> partition = Lists.partition(stringList1, 200);

上面代码的作用就是把我们的stringList1分割成200一份的小list,这时候你再配合上forEach,需求就完美实现了。

让你的开发过程更简单,更便捷,其他List的子类创建类似。

list反转

实际开发中,经常要将list反转,比如1, 2, 3, 4的list反转成4, 3, 2, 1,自己写的话,需要写个for循环,然后反向输出到另一个List,但是用guava就贼简单:

List integerList = Lists.newArrayList(1, 2, 3, 4);

// 反转list

List reverse = Lists.reverse(integerList);

list转换

比如我要将一个List根据一定的条件转换成一个List,我可以这样操作:

List stringList2 = Lists.newArrayList("hello", "world", "");

List transform = Lists.transform(stringList2, s -> !"".equals(s));

我转换的条件是只有不是空字符串就是true,这里s -> !"".equals(s)是lamubda表达式的写法(最近一直在提这个,这个现在确实已经是主流了),展开写确实占行数:

List transform2 = Lists.transform(stringList2,

new Function() {

@Override

public @Nullable Boolean apply(@Nullable String input) {

return !"".equals(input);

}

});

其他更多方法,大家自己下载研究,上面这些已经很可以了,满足日常大部分需求,接下来,我们再来看下Maps。

Maps

与List类似,Maps这个类也提供了很多map相关的方法,下面我们就来看一下。

创建map

HashMap objectObjectHashMap = Maps.newHashMap();

HashMap objectObjectHashMap1 = Maps.newHashMap(objectObjectHashMap);

比较两个map

这个方法就很强大,不仅可以返回两个map的交集,还能返回每个map不同的地方,结果都是map

HashMap objectObjectHashMap = Maps.newHashMap();

objectObjectHashMap.put("k1", "v1");

objectObjectHashMap.put("k2", "v2");

objectObjectHashMap.put("k3", "v3");

HashMap objectObjectHashMap1 = Maps.newHashMap(objectObjectHashMap);

objectObjectHashMap.put("k4", "v4");

objectObjectHashMap1.put("k5", "v5");

// 比较两个map

MapDifference difference = Maps.difference(objectObjectHashMap, objectObjectHashMap1);

// 返回交集

Map objectObjectMapCommon = difference.entriesInCommon();

// 返回左侧map特有的

Map objectObjectMap1Left = difference.entriesOnlyOnLeft();

// 返回右侧map特有的

Map objectObjectMap2Right = difference.entriesOnlyOnRight();

System.out.println(objectObjectMapCommon);

System.out.println(objectObjectMap1Left);

System.out.println(objectObjectMap2Right);

将集合转为Map

这里还提供了将List等集合转为map的方法:

ImmutableMap stringStringImmutableMap2 = Maps.toMap(stringList, s -> s);

上面的代码就是将一个list转成key和value都一样的map。

或者将map转换为新的map:

ImmutableMap, Boolean> entryBooleanImmutableMap = Maps.toMap(stringObjectImmutableMap.entrySet(), k -> "123123".equals(k));

总结

今天,我们分享了Lists和Maps的很多常用的方法,并演示了常用的方法,还有很多内容没讲到,一方面说明它也不常用(我没用到就是不常用),另外一方面,guava目前我只用到了集合下的一部分功能,所以目前就分享这么多。但是,guava用起来真的很方便,也确实解决了很多开发中的问题,提高了我们的开发效率,至于其他的内容,后期看情况。

最后,我们先安利另外一款比较火的工具包——huTool,提供的方法也很丰富,因为是国人开源的,所以很容易上手,这里我们先简单预告下,后期专门分享,工具包官方开源地址:

https://hutool.cn/

好了,今天就到这里吧!