前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Guava工具类简介

Guava工具类简介

原创
作者头像
Kokomo
发布2023-11-27 13:45:26
2210
发布2023-11-27 13:45:26
举报
文章被收录于专栏:灵墨AI探索室灵墨AI探索室

简介

Guava是Google公司开发的一款Java类库扩展包。很多小伙伴的项目中已经引入了,但并没有使用,大家对于这个也是偶尔使用,但Guava中包涵了很多方面的类,例如集合、缓存、并发、IO等,今天笔者就带大家了解一下Guava内的一些类,希望对大家有所帮助。

详解

Maven

代码语言:txt
复制
      <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>31.1-jre</version>
      </dependency>

Guava的引入十分简单 只要在pom中引入这个结构就可以了

HashBasedTable 双键Map

HashBasedTable 是Guava提供的一个双键Map,如果我们想要定义一个两个Key的Map,用以存放学生对应科目的分数,在之前我们可以这样写

代码语言:java
复制
// 两个key 分别对应学生名字和科目名
Map<String,Map<String,Integer>> courseMap = new HashMap<>();

但在引入Guava后我们的代码可以优化为以下形式

代码语言:java
复制
        HashBasedTable<String, String, Integer> basedTable = HashBasedTable.create();

        basedTable.put("Tom","Art",20);
        basedTable.put("Tom","Math",40);
        basedTable.put("Jerry","English",60);
        
        // [Tom, Jerry]
        Set<String> rowKeySet = basedTable.rowKeySet();

        //[Art, Math, English]
        Set<String> columnKeySet = basedTable.columnKeySet();

        // 20
        Integer score = basedTable.get("Tom", "Art");

在定义完HashBasedTable后可以利用rowKeySet()和columnKeySet() 获取行或列的keySet,通过这个类可以大大简化我们的代码和工作量。

BiMap 双向map

在实际开发过程中,我们会经常通过value找对应的key值,如果是原有的map,我们只能循环整个map,对value进行匹配 从而寻找key

代码语言:java
复制
  for (String key : map.keySet()) {
    if (map.get(key).equals(val))
      return map.getKey();
  }

在Guava中通过提供的BiMap 我们可以很轻松的实现类似的功能

代码语言:java
复制
       HashBiMap< Object, Object> biMap = HashBiMap.create();
        biMap.put("Tom",1);
        biMap.put("Jerry",2);
        biMap.put("Lily",3);
        
        BiMap<Object, Object> inverse = biMap.inverse();
        
        inverse.get(1);

但要注意的是在BiMap中Key和Value均不能重复且不能为null,并且inverse后的map与原map是一个对象,对inverse后的map操作相当于对原有map进行操作。

多值Map Multimap

Guava中还提供了一个多值的Map,在这个map中每一个Key的Value都是一个集合,这取决于定义Multimap的类型,可以采用ArrayListMultimap也可以使用TreeListMultimap、HashListMultimap等

代码语言:java
复制
        Multimap<String,Integer> multimap= ArrayListMultimap.create();

        multimap.put("a",1);
        multimap.put("a",2);
        multimap.put("b",1);

        //[1, 2]
        System.out.println(multimap.get("a"));

要注意,和BiMap的使用类似,使用get方法返回的集合也不是一个独立的对象,可以理解为集合视图的关联,对这个新集合的操作仍然会作用于原始的Multimap上。

范围Map RangeMap

先看一个例子,假设我们要根据分数对考试成绩进行分类,那么代码中就会出现这样丑陋的if-else:

代码语言:java
复制
public static String getRank(int score){
    if (0<=score && score<60)
        return "fail";
    else if (60<=score && score<=90)
        return "satisfactory";
    else if (90<score && score<=100)
        return "excellent";
    return null;
}

而guava中的RangeMap描述了一种从区间到特定值的映射关系,让我们能够以更为优雅的方法来书写代码。下面用RangeMap改造上面的代码并进行测试:

代码语言:java
复制
RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closedOpen(0,60),"fail");
rangeMap.put(Range.closed(60,90),"satisfa");
rangeMap.put(Range.openClosed(90,100),"excellent");
//fail
System.out.println(rangeMap.get(59));
//satisfa
System.out.println(rangeMap.get(60));
////satisfa
System.out.println(rangeMap.get(90));
//excellent
System.out.println(rangeMap.get(91));

在上面的代码中,先后创建了[0,60)的左闭右开区间、60,90的闭区间、(90,100]的左开右闭区间,并分别映射到某个值上。运行结果打印:

谓词

除了集合外 Guava还提供了谓词的相关的工具类。一般而言,谓词是关于正确或错误的陈述。

如果我们需要对于一个条件信息判断 然后决定是否抛出异常,我们可以这么写

代码语言:java
复制
  if(false){
    throw new Exception("报错啦");
  }

通过Preconditions 可以简化为

代码语言:java
复制
Preconditions.checkArgument(false,"报错啦");

此外还提供了判空、字符匹配等相关方法

代码语言:java
复制
//判断字符是否包含o
Predicates.containsPattern("o");
//判空
Predicates.notNull();

切分字符串

一般我们操作字符串都会使用String的split方法,但返回的一般是个数组,使用困困难,这时我们可以利用Guava提供的相关类操作 事半功倍

代码语言:java
复制
   String input = "String input = "这,里, ,是,灵墨AI 探索室";
   List<String> words = 
       Splitter.on(",").trimResults()
                .limit(3).splitToList(input);
   /**
   这
   里
   ,是,灵墨AI 探索室
   */
   for (String word: words) {
            System.out.println(word);
   }
        

通过Splitter可以更加快捷、有效的实现字符串的切割

尾声

通过本文为大家总结了一下Guava中常用的类,在工作中使用得当可以大大的提升效率,但也要注意一些需要避开的坑,希望本文能为大家带来帮助。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 详解
  • Maven
  • HashBasedTable 双键Map
  • BiMap 双向map
  • 多值Map Multimap
  • 范围Map RangeMap
  • 谓词
  • 切分字符串
    • 尾声
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档