2018-10-29

工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率。谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来。所以就诞生了guava。。

高效设计良好的API,被Google的开发者设计,实现和使用
遵循高效的java语法实践
使代码更刻度,简洁,简单
节约时间,资源,提高生产力
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:

集合 [collections]
缓存 [caching]
原生类型支持 [primitives support]
并发库 [concurrency libraries]
通用注解 [common annotations]
字符串处理 [string processing]
I/O 等等。

使用
引入maven依赖(就是引入jar包)

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>27.0-jre</version>
</dependency>
  1. 集合的创建
//普通Collection创建,和原来方法区别不大
List<String> list = Lists.newArrayList();
HashSet<String> set = Sets.newHashSet();
HashMap<Object, Object> map = Maps.newHashMap();
//不可变Collection,实现了原来的接口
ImmutableList<String> iList = ImmutableList.of("a", "b", "c");
ImmutableSet<String> iSet = ImmutableSet.of("e1", "e2");
ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");

不可变类有什么用:
1.在多线程操作下,是线程安全的。
2.所有不可变集合会比可变集合更有效的利用资源。
3.中途不可改变

Map中的value为List的时候,新旧写法对比。

//旧写法
HashMap<String, List<Integer>> hashMap = new HashMap<>();
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
hashMap.put("aaa", list);
System.out.println(hashMap);//{aaa=[1, 2]}

//新写法
Multimap<String, Integer> multimap = ArrayListMultimap.create();
multimap.put("aaa", 1);
multimap.put("aaa", 2);
System.out.println(multimap);//{aaa=[1, 2]}

其他集合

MultiSet: 无序+可重复   count()方法获取单词的次数  增强了可读性+操作简单
创建方式:  Multiset<String> set = HashMultiset.create();

Multimap: key-value  key可以重复  
创建方式: Multimap<String, String> teachers = ArrayListMultimap.create();

BiMap: 双向Map(Bidirectional Map) 键与值都不能重复
创建方式:  BiMap<String, String> biMap = HashBiMap.create();

Table: 双键的Map Map--> Table-->rowKey+columnKey+value  //和sql中的联合主键有点像
创建方式: Table<String, String, Integer> tables = HashBasedTable.create();

...等等(guava中还有很多java里面没有给出的集合类型)

List转字符串,并且添加连接符,新旧方法对比

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
String string = new String();
for (String str : list) {
    string += "," + str;
}
System.out.println("string:" + string.substring(1));//string:a,b,c

Lists.newArrayList("a", "b", "c");
String string1 = Joiner.on(",").join(list);
System.out.println("string1:" + string1);//string1:a,b,c

Map按照特定格式输出字符串

Map<String, Integer> map = Maps.newHashMap();
map.put("小明", 20);
map.put("小红", 23);
String string = Joiner.on("、").withKeyValueSeparator("=>").join(map);
System.out.println(string);//小明=>20、小红=>23

将String转换为List,新旧方法对比

String string = "a,b,c,d,e,f";
String[] strings = string.split(",");
List<String> list = Lists.newArrayList();
for (String str : strings) {
    list.add(str);
}
System.out.println(list);//[a, b, c, d, e, f]

List<String> list2 = Splitter.on(",").splitToList(string);
System.out.println(list2);//[a, b, c, d, e, f]

特殊格式字符串,omitEmptyStrings()可以去除空字符串,trimResults()可以去除分割后的字符串前后的空格

String str = "1,2,3,4,  5,  6  , ";
List<String> list = Splitter.on(",").omitEmptyStrings().trimResults().splitToList(str);
List<String> list1 = Splitter.on(",").splitToList(str);
System.out.println(list);//[1, 2, 3, 4, 5, 6]
System.out.println(list1);//[1, 2, 3, 4,   5,   6  ,  ]

将String转为Map

String str = "小明=20,小红=23";
Map<String, String> map = Splitter.on(",").withKeyValueSeparator("=").split(str);
System.out.println(map);//{小明=20, 小红=23}

正则分割

String input = "aa.dd,,ff,,.";
List<String> result = Splitter.onPattern("[.|,]").omitEmptyStrings().splitToList(input);
System.out.println(result);//[aa, dd, ff]

关于字符串的操作 都是在Splitter这个类上进行的

// 判断匹配结果
boolean result = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')).matches('2'); //true
// 保留数字文本
String s1 = CharMatcher.digit().retainFrom("abc 123 efg"); //123
// 删除数字文本
String s2 = CharMatcher.digit().removeFrom("abc 123 efg");    //abc  efg

集合的过滤
我们对集合的操作,一般都是循环遍历集合,然后对其中的属性进行操作。

//按照条件过滤
ImmutableList<String> names = ImmutableList.of("begin", "code", "Guava", "Java");
Iterable<String> fitered = Iterables.filter(names, Predicates.or(Predicates.equalTo("Guava"), Predicates.equalTo("Java")));
System.out.println(fitered); // [Guava, Java]

//自定义过滤条件   使用自定义回调方法对Map的每个Value进行操作
ImmutableMap<String, Integer> m = ImmutableMap.of("begin", 12, "code", 15);
// Function<F, T> F表示apply()方法input的类型,T表示apply()方法返回类型
Map<String, Integer> m2 = Maps.transformValues(m, new Function<Integer, Integer>() {
    public Integer apply(Integer input) {
        if (input > 12) {
            return input;
        } else {
            return input + 1;
        }
    }
});
System.out.println(m2);   //{begin=13, code=15}

set的交集, 并集, 差集

Set setA = Sets.newHashSet(1, 2, 3, 4, 5);
Set setB = Sets.newHashSet(4, 5, 6, 7, 8);

//A并B
Set union = Sets.union(setA, setB);
System.out.println(union);//[1, 2, 3, 4, 5, 8, 6, 7]

//A差B
Set difference = Sets.difference(setA, setB);
System.out.println(difference);//[1, 2, 3]

//A交B
Set intersection = Sets.intersection(setA, setB);
System.out.println(intersection);//[4, 5]

map的交集,并集,差集(没测试)

MapDifference differenceMap = Maps.difference(mapA, mapB);  
differenceMap.areEqual();  
Map entriesDiffering = differenceMap.entriesDiffering();  
Map entriesOnlyOnLeft = differenceMap.entriesOnlyOnLeft();  
Map entriesOnlyOnRight = differenceMap.entriesOnlyOnRight();  
Map entriesInCommon = differenceMap.entriesInCommon();  

参数检查

List list = Lists.newArrayList();
String str = new String();
//use java
Boolean boolean1 = (list != null && list.size() > 0);
Boolean boolean2 = (str != null && str.length() > 0);
Boolean boolean3 = (str != null && !str.isEmpty());

//use guava
Boolean boolean4 = CollectionUtils.isEmpty(list);//替代boolean1和boolean2
Boolean boolean5 = StringUtils.isNotEmpty(str);//替代boolean3

//use java
int count = 0;
if (count <= 0) {
    throw new IllegalArgumentException("must be positive: " + count);
}

//use guava
Preconditions.checkArgument(count > 0, "must be positive: %s", count);

checkNotNull在检查对象为空时抛出空指针

@CanIgnoreReturnValue
public static <T> T checkNotNull(T reference) {
    if (reference == null) {
      throw new NullPointerException();
    }
    return reference;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 已经很少有事情可以让我开心地像个孩子了 我渐渐开始认同一些黑暗的想法,我很害怕自己会变成一个问题少女 可是,我依然...
    无问深秋的深浅阅读 109评论 0 0