安利一个java开发利器——guava

发布时间 2023-12-12 17:59:43作者: 云中志

前言

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

guava

guava是什么

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

guava的应用

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

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

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1.1-jre</version>
    <!-- or, for Android: -->
    <!--<version>30.1.1-android</version>-->
</dependency>

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

集合(Lists)

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

创建和添加对象

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

// 创建集合
List<String> stringList1 = new ArrayList<>();
// 添加对象
stringList1.add("hello");
stringList1.add("world");

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

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

还支持直接传入数组:

String[] strings = new String[] {"1231", "23432423"};
ArrayList<String> strings1 = Lists.newArrayList(strings);

list分割

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

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

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

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

list反转

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

List<Integer> integerList = Lists.newArrayList(1, 2, 3, 4);
// 反转list
List<Integer> reverse = Lists.reverse(integerList);

list转换

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

List<String> stringList2 = Lists.newArrayList("hello", "world", "");
List<Boolean> transform = Lists.transform(stringList2, s -> !"".equals(s));

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

List<Boolean> transform2 = Lists.transform(stringList2, 
     new Function<String, Boolean>() {
            @Override
            public @Nullable Boolean apply(@Nullable String input) {
                return !"".equals(input);
            }
        });

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

Maps

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

创建map

HashMap<Object, Object> objectObjectHashMap = Maps.newHashMap();
        HashMap<Object, Object> objectObjectHashMap1 = Maps.newHashMap(objectObjectHashMap);

比较两个map

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

HashMap<Object, Object> objectObjectHashMap = Maps.newHashMap();
        objectObjectHashMap.put("k1", "v1");
        objectObjectHashMap.put("k2", "v2");
        objectObjectHashMap.put("k3", "v3");

        HashMap<Object, Object> objectObjectHashMap1 = Maps.newHashMap(objectObjectHashMap);
        objectObjectHashMap.put("k4", "v4");
        objectObjectHashMap1.put("k5", "v5");
// 比较两个map
        MapDifference<Object, Object> difference = Maps.difference(objectObjectHashMap, objectObjectHashMap1);
// 返回交集
        Map<Object, Object> objectObjectMapCommon = difference.entriesInCommon();
// 返回左侧map特有的
        Map<Object, Object> objectObjectMap1Left = difference.entriesOnlyOnLeft();
// 返回右侧map特有的
        Map<Object, Object> objectObjectMap2Right = difference.entriesOnlyOnRight();
        System.out.println(objectObjectMapCommon);
        System.out.println(objectObjectMap1Left);
        System.out.println(objectObjectMap2Right);

将集合转为Map

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

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

上面的代码就是将一个list转成keyvalue都一样的map

或者将map转换为新的map:

        ImmutableMap<Map.Entry<String, Object>, Boolean> entryBooleanImmutableMap = Maps.toMap(stringObjectImmutableMap.entrySet(), k -> "123123".equals(k));

总结

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

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

https://hutool.cn/

好了,今天就到这里吧!