Guava工具类简介

2023-11-27 13:45:26 浏览数 (1)

简介

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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞