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