Guava简单使用

简介

Guava是一种基于开源的Java库,这个库是为了方便编码,并减少编码错误。这个库用于提供集合,缓存,支持原语句,并发性,常见注解,字符串处理,I/O和验证的实用方法。

引包

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>11.0.2</version>
</dependency>

常用工具类

1.Lists,Sets

集合工具类

List list1 = Lists.newArrayList("element1","element2") //新建
Lists.partition(list1, 10) //拆分
Lists.reverse(list1) //反转排序

2.Preconditions 前置校验

前置条件适用于当判断与设置的条件不符合时,抛出异常的操作。

 /**
         * 对象判空处理
         */
        UserInfo userInfo = null;
        Preconditions.checkNotNull(userInfo, "userInfo不能为null");
 
        /**
         * List对象判空处理
         */
        List<String> list = Lists.newArrayList();
        Preconditions.checkNotNull(list, "传入的list不能为null");
 
        /**
         * 数值类型判断处理
         */
        Long projectId = -12L;
        Preconditions.checkNotNull(projectId, "projectId不能为null");
        Preconditions.checkArgument(projectId > 0, "输入projectId必须大于0", projectId);

3.Splitter

Splitter可以对字符串进行分割,在分割时的方式有2种,
1.按字符/字符串分割
2.按正则进行分割
Splitter在分割完成时可以转换成list和map

1.按字符分隔
//1.用指定字符切分字符串,并转换成list
String s1 = "hello|hihi";
String s2 = "hello|haha|||";
Splitter.on("|").splitToList(s1).forEach(System.out::println);
Splitter.on("|").split(s1).forEach(item ->System.out.println(item));

//2.忽略掉空的字符串或者多余的分割符
Splitter.on("|").omitEmptyStrings().splitToList(s2).forEach(System.out::println);
       
 //3.忽略掉字符串中的空格
Splitter.on("|").omitEmptyStrings().trimResults().splitToList("hello | guava|||").forEach(System.out::println);

//4.固定长度分割
Splitter.on("|").fixedLength(4).splitToList("aaaabbbbccccdddd").forEach(System.out::println);


//5.指定长度分割
List<String> list = Splitter.on("#").limit(3).splitToList("a#b#c#d#e#"); //以#来分割,分3部分成 a b #c#d#e 3部分
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));

2.按正则分隔
 Pattern SPLIT_PATTERN = Pattern.compile("[\\,\\,\\s]+|\\|");
List<String> strings = Splitter.on(SPLIT_PATTERN).omitEmptyStrings().trimResults().splitToList(
            "String,12,3");

4.Stopwatch

计时器,可用于记录某段代码or接口执行时间,替代用System.currentTimeMillis()相减。

 Stopwatch watch = Stopwatch.createStarted();
 Thread.sleep(1000L);
 long time = watch.elapsed(TimeUnit.MILLISECONDS);

5.rateLimiter

用于接口限流

    public static class LimitingCommpont {
        RateLimiter rateLimiter;
        String name;

        public <T> T exec(Double limitCount,Long waitTime, RateLimiterFactory.Callback<T> callback) {
            if (rateLimiter.getRate() != limitCount) {
                rateLimiter.setRate(limitCount); //设置速率,每秒多少许可数
            }
            try {
                //从RateLimiter 获取许可如果该许可可以在不超过timeout的时间内获取得到的话,或者如果无法在timeout 过期之前获取得到许可的话,那么立即返回false(无需等待)
                rateLimiter.tryAcquire(waitTime, TimeUnit.SECONDS); //
            } catch (Exception e) {
                log.error("限流失败 {}", name);
            }
            log.info("每秒qps值 name : {} time : {} ", name, System.currentTimeMillis() / 1000);
            return callback.apply();
        }
    }

6.Range

区间,也称为范围 ,通常可以用于时间、金额等范围判断。
1.区间创建

概念 表示范围 guava对应功能方法
(a..b) {x | a < x < b} open(C, C)
[a..b] {x | a <= x <= b} closed(C, C)
[a..b) {x | a <= x < b} closedOpen(C, C)
(a..b] {x | a < x <= b} openClosed(C, C)
(a..+∞) {x | x > a} greaterThan(C)
[a..+∞) {x | x >= a} atLeast(C)
(-∞..b) {x | x < b} lessThan(C)
(-∞..b] {x | x <= b} atMost(C)
(-∞..+∞) all values all()

2.操作方法

//1.contains:判断值是否在当前Range内
Range.lessThan(4.0); //严格小于4.0的double值
Range.closed(1, 3).contains(2);//return true
Range.lessThan(5).contains(5); //return false
Range.closed(1, 4).containsAll(Ints.asList(1, 2, 3)); //return true
//2.isConnected。range是否可连接上
Range.closed(3, 5).isConnected(Range.open(5, 10));// true
Range.closed(0, 9).isConnected(Range.closed(3, 4));//true
Range.open(3, 5).isConnected(Range.open(5, 10));//false
Range.closed(1, 5).isConnected(Range.closed(6, 10));//false

3.案例

  Date now = DateUtils.ceiling(new Date(), Calendar.DATE);
        // 5天后
        Date nowafter5day = DateUtils.addDays(now, 5);
        // 6天后
        Date nowafter6day = DateUtils.addDays(now, 6);
        // 7天后
        Date nowafter7day = DateUtils.addDays(now, 7);
        // 8天后
        Date nowafter8day = DateUtils.addDays(now, 8);
        // 8天后
        Date nowafter9day = DateUtils.addDays(now, 9);

        // 10天后
        Date nowafter10day = DateUtils.addDays(now, 10);

        // 已有档期
        Range planA = Range.openClosed(now, nowafter5day);
        Range planB = Range.openClosed(nowafter8day, nowafter10day);
        List<Range> existRangeList = Lists.newArrayList(planA, planB);

        // 新计划
        Range planNew = Range.openClosed(nowafter6day, nowafter7day);
        int count = 0;
        for (Range li : existRangeList) {
            if (li.isConnected(planNew)) {
                System.out.println("planNew["+planNew+"]档期重叠,校验不通过");
                break;
            }
            ++count;
        }
        if (count == existRangeList.size()) {
            System.out.println("planNew["+planNew+"]通过校验");
            existRangeList.add(planNew);
        }

        Range planNew2 = Range.openClosed(nowafter7day, nowafter9day);
        count = 0;
        for (Range li : existRangeList) {
            if (li.isConnected(planNew2)) {
                System.out.println("PlanNew2["+planNew2+"]档期重叠,校验不通过");
                break;
            }
            ++count;
        }
        if (count == existRangeList.size()) {
            System.out.println("planNew2["+planNew2+"]通过校验");
            existRangeList.add(planNew2);
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,492评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,048评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,927评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,293评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,309评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,024评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,638评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,546评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,073评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,188评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,321评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,998评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,678评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,186评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,303评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,663评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,330评论 2 358

推荐阅读更多精彩内容