优雅编程之Guava瓜娃工具类的7点整理学习分享(三十九)

开心一笑

【面试官:“熟悉哪种语言”。
应聘者:“JAVA”。
面试官:“知道什么叫类么”。
应聘者:“我这人实在,工作努力,不知道什么叫累”。
面试官:“知道什么是包?”。
应聘者:“我这人实在 平常不带包 也不用公司准备了”。
面试官:“知道什么是接口吗?”。
应聘者:“我这个人工作认真。从来不找借口偷懒”。
面试官:“知道什么是继承么”。
应聘者:“我是 孤儿没什么可以继承的”。
面试官:“知道什么叫对象么?”。
应聘者:“知道,不过我工作努力,上进心强,暂时还没有打算找对象。”。
面试官:“知道多态么?”。
应聘者:“知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系?”】

唯美图片

提出问题

Guava扩展包对项目比较有用的知识有哪些???

解决问题

1.Guava扩展包的简单介绍

Guava,中文是石榴的意思 ,一个基于JDK1.6类库集合的扩展项目

源码包的简单说明:

com.google.common.annotations:普通注解类型。
  com.google.common.base:基本工具类库和接口。
  com.google.common.cache:缓存工具包,非常简单易用且功能强大的JVM内缓存。
  com.google.common.collect:带泛型的集合接口扩展和实现,以及工具类,这里你会发现很多好玩的集合。
  com.google.common.eventbus:发布订阅风格的事件总线。
  com.google.common.hash: 哈希工具包。
  com.google.common.io:I/O工具包。
  com.google.common.math:原始算术类型和超大数的运算工具包。
  com.google.common.net:网络工具包。
  com.google.common.primitives:八种原始类型和无符号类型的静态工具包。
  com.google.common.reflect:反射工具包。
  com.google.common.util.concurrent:多线程工具包。

更多的内容,可以阅读下面参考的文章。

我比较关心的是如何使用该工具类,使JAVa代码更加优雅,更加简洁,然后愉快的玩耍。

2.强大的Strings类

实例一:

package com.evada.de;
import com.google.common.base.Strings;
import org.junit.Test;
/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        System.out.println(Strings.isNullOrEmpty(""));//true
        System.out.println(Strings.nullToEmpty(null));//""
        System.out.println(Strings.nullToEmpty("ay"));//"ay"
        System.out.println(Strings.emptyToNull(""));//null
        System.out.println(Strings.emptyToNull("ay"));//"ay"
        System.out.println(Strings.commonPrefix("aaay", "aal"));//"aa"否则返回""
        System.out.println(Strings.commonSuffix("aaay", "aal"));//"aac"否则返回""

        String str1 = "ay.";
        //在str1后补'a'补够15个长度
        String strr1 = Strings.padEnd(str1, 15,'l');
        System.out.println(strr1);//ay.llllllllllll
        //在str2前补'a'补够10个长度
        String str2 = "welcome";
        String  strr2 = Strings.padStart(str2, 10,  'm');
        System.out.println(strr2);
    }
}

实例二:

package com.evada.de;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        Joiner joiner = Joiner.on("; ").skipNulls();
        System.out.println(joiner.join("ay", null, "al", "love"));//ay; al; love

        List<String> joinListStr = new ArrayList<>();
        joinListStr.add("ay");
        joinListStr.add(null);
        joinListStr.add("al");
        joinListStr.add("love");
        Joiner joiner2 = Joiner.on("; ").skipNulls();
        System.out.println(joiner2.join(joinListStr));//ay; al; love
        //trimResults 和 omitEmptyStrings可以去空,去空白
        Iterable splitterArray =  Splitter.on(',').trimResults().omitEmptyStrings().split("ay,al,,   love");
        System.out.println(splitterArray.toString());//[ay, al, love]
        //传统的字符串分割
        String[] originArray = "ay,al,,   love".split(",");
        System.out.println(Arrays.toString(originArray));//[ay, al, ,    love]
        System.out.println(originArray.length);// 4(长度为)
        for(int i=0;i<originArray.length;i++){
            System.out.println(originArray[i]);
        }
//        4
//        ay
//                al
//
//        love



    }
}

连接器[Joiner] 和 拆分器[Splitter] 拆分器修饰符

方法                          描述
omitEmptyStrings()       从结果中自动忽略空字符串
trimResults()            移除结果字符串的前导空白和尾部空白
trimResults(CharMatcher) 给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
limit(int)               限制拆分出的字符串数量

如果想要拆分器返回List,只要使用Lists.newArrayList(splitter.split(string))或类似方法。

splitter实例总是不可变的。用来定义splitter目标语义的配置方法总会返回一个新的splitter实例。这使得splitter实例都是线程安全的,你可以将其定义为static final常量。

我们看看源码就清楚了:

public static Splitter on(final CharMatcher separatorMatcher) {
    Preconditions.checkNotNull(separatorMatcher);
    //新的splitter实例
    return new Splitter(new Splitter.Strategy() {
        public Splitter.SplittingIterator iterator(final Splitter splitter, final CharSequence toSplit) {
            return new Splitter.SplittingIterator(splitter, toSplit) {
                int separatorStart(int start) {
                    return separatorMatcher.indexIn(this.toSplit, start);
                }

                int separatorEnd(int separatorPosition) {
                    return separatorPosition + 1;
                }
            };
        }
    });
}

3.强大的集合工具类

3.1集合实例化

package com.evada.de;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.junit.Test;

import java.util.*;

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        //传统的
        List<String> list = new ArrayList<String>();
        //Gvava瓜娃写法
        List<String> list2 = Lists.newArrayList();
        Map<String, String> map = Maps.newLinkedHashMap();
        //这个构造方法非常实用
        List<String> list3 = Lists.newArrayList("ay", "and", "al");
        //指定容器的大小
        List<String> exactly100 = Lists.newArrayListWithCapacity(100);
        List<String> approx100 = Lists.newArrayListWithExpectedSize(100);
        Set<String> approx100Set = Sets.newHashSetWithExpectedSize(100);
    }
}

更多的内容可以参考官方API

3.2 Iterables

package com.evada.de;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.junit.Test;

import java.util.*;

/**
 * @Author 阿毅
 * Created by Ay on 2016/01/21.
 */
public class Ay{
    @Test
    public void test(){
        List<String> list3 = Lists.newArrayList("ay", "and", "al");
        //好用
        Iterable<String> concatenated = Iterables.concat(list3);
        String lastAdded = Iterables.getLast(concatenated);
        System.out.println(lastAdded);//al
    }
}

Guava还提供了很多其他集合的好用方法,这里只是简单的罗列出比较有用的,更多内容可以百度上搜索。

3.3不可变集合与使用不可变集合

不可变集合优点:

  • 当对象被不可信的库调用时,不可变形式是安全的;
  • 不可变对象被多个线程调用时,不存在竞态条件问题
  • 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);
  • 不可变对象因为有固定不变,可以作为常量来安全使用。

不可变集合可以用如下多种方式创建:

  • copyOf方法,如ImmutableSet.copyOf(set);
  • of方法,如ImmutableSet.of(“a”, “b”, “c”)或ImmutableMap.of(“a”, 1, “b”, 2);
  • Builder工具,如
public static final ImmutableSet<Color> GOOGLE_COLORS =
ImmutableSet.<Color>builder()
    .addAll(WEBSAFE_COLORS)
    .add(new Color(0, 191, 255))
    .build();

此外,对有序不可变集合来说,排序是在构造集合的时候完成的,如:

ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");

会在构造时就把元素排序为a, b, c, d。

4.好用的Object方法

Objects.equal("a", "a"); // returns true
Objects.equal(null, "a"); // returns false
Objects.equal("a", null); // returns false
Objects.equal(null, null); // returns true

在前面的文章《Java之项目用到类Objects,TreeMap排序简单分享》,有提到,可以去阅读

5.Guava I/O流

6.Guava新集合类型

7.Guava并发

上面的内容可以自学,网上资料还是很多的。

读书感悟

来自键人(林育圣)《负负得正的人生奥义书》

  • 多照照镜子,很多事情你就明白原因了。
  • 如果你觉得自己,整天累得跟狗一样 ,你真是误会大了,狗都没你这么累。
  • 做个爱笑的人,其实更容易受伤。你总是笑,别人就觉得怎么伤你都没关系。
  • 努力了这么多年,但凡是有点天赋的,也该有点成功迹象了。
  • 许多人的努力,只是为了欺骗自己和做给别人看的而已。他们都只是看起来很努力而已。
  • 有时候你会怀疑自己的能力,别担心,偶尔你是对的,你能力真的有问题。
  • 很多朋友喜欢分享旅游经验,看着他们把钱花光出去走一趟。回来后生活没有任何改变,我就感到放心了。
  • 所有的工作,做久了都会觉得无聊。差别在于,别人无聊还赚得比你多。
  • 如果摆错地方,钻石也会被当作石头,但石头不管摆哪都还是石头。
  • 有人说不要常抱怨,因为生活就是如人饮水冷暖自知就好,我想问你被热水烫到不会大叫吗?
  • 又一天过去了,今天觉得如何呢?梦想是不是又更远了?
  • 有时候我们讨厌一个人,绝对不是没由来的,谁叫他看起来比你聪明有钱又有趣,还有比你快乐有成就感又受欢迎,所以我们只好比谁都讨厌他。
  • 大多数人爱嚷嚷做自己不过是因为能力太差,无法扮演好社会的角色而已。
  • 休息是为了走更长远的路,为了方便别人走路,所以我在家多休息。
  • 有些人只看到单一事件,就以为别人都是过怎样的生活,就好像看到有人在奔驰上哭,就觉得有钱人都过得不开心,其实人家剩下的时间都开心的很。
  • 有时候我们讨厌的并不是事实本身,而是那个说出事实的人。
  • 虽然努力没有什么帮助,但是过程很重要,你可以发现自己真的是弱爆了。
  • 越是没有能力改变自己生活的人,越喜欢批评别人的改变。
  • 其实不需要靠你的打击,我也知道自己的脆弱。
  • 有时候觉得别人很肤浅,这不是偏见,因为他真的只是在敷衍你。
  • 乐观的态度与安慰的话,过过日子还可以,当遇到困难与挑战时,一点帮助都没有。

经典故事

【加拿大有一个印第安人的部落,冬天过后,他们点起篝火,将所有过冬的帐篷,用具付之一炬,重修开始四处渔猎的生活。启发:学会忘掉过去,推翻过去自己,重新开始】

大神文章

【1】Guava学习笔记:Google Guava 类库简介
【2】Java代码优雅之道-Guava
【3】强大的GUAVA之Strings
【4】[Guava学习笔记]Strings: 字符串处理
【5】[Google Guava] 6-字符串处理:分割,连接,填充
【6】[Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
【7】[Google Guava] 2.1-不可变集合

其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 文/张智友 迷茫的街头,只剩你和我,月亮在路边走 月亮下的你我,沉默的像两只狗。 你说你想走,我说我不敢留。 你叫...
    张智友阅读 301评论 0 1
  • 人生的十字路口,轻轻巧巧的一步,回头看,一生的惊涛骇浪也许已埋伏其间。 最近面临毕业,仍然不知道自己要做什么。
    ALeesa阅读 199评论 0 0
  • 1.古狄逊定律:定好位置,如果你是管理者,不要抢员工的工作,可能是你很擅长,可能是你做的比较好,但是一个团队的需求...
    王榕榕阅读 190评论 0 0