当前位置:   article > 正文

【guava】 谷歌guava工具包的常用方法 双key的map 、驼峰转下划线等小结

guava工具包

1. maven引入 (某些框架会引入guava 注意版本冲突问题)

    	   <!-- guava工具包-->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>30.0-jre</version>
            </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2. guava 对集合的处理



        // 如不清楚jdk自带的Arrays.asList() 和list.add有什么区别 建议别用Arrays.asList()
        // 谷歌的Lists.newArrayList 和list add基本是等效的 额外判断了初始大小 提高了效率
        ArrayList<String> list = Lists.newArrayList("1", "2", null, "", "3");

        // 只会跳过null 不会跳过空串
        String join = Joiner.on("_").skipNulls().join(list);
        System.out.println(join);
        
        // 给null设置默认值
        String str = Joiner.on("|").useForNull("给null赋予的默认值").join(list);
        System.out.println(str);

        String splitStr = "aa|bb|cc|dd|ee||ff";
        // 这里则是跳过分割符之间的空串了 (ee|和|ff之间那个空串)  因为已经在String里面了 是不可能存在null的
        List<String> strings = Splitter.on("|").omitEmptyStrings().splitToList(splitStr);

        // 转成Stream流 配合stream流的各种操作 非常好用!  omitEmptyStrings 跳过空值
        Stream<String> stringStream = Splitter.on("|").omitEmptyStrings().splitToStream(splitStr);

        String space = "aa| |bb|cc";
        // 去除空格 注意空格去除后就是空串了 如果需要去除空串 链式结合omitEmptyStrings
        List<String> trims = Splitter.on("|").trimResults().splitToList(space);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3. guava的 双键table (双key map)

即使暂时用不上 也可以牢记有这么个容器,相当于map有两个key,迟早能用上的。
这里简单举两个我在工作中遇到的场景:

a. 需求分别是统计24h/7d/30d 的风速,24h/7d/30d的 温度 , 24h/7d/30d 的水速 等等... 
特点就是 需求高度类似,这样我们就可以对外只提供一个接口。
可以定义一个item枚举类,用来存放风速、温度、水速等统计项,
还需要定义一个period枚举类 用来存放24h 、7d、30d等统计周期,
我们可以根据item和period  去获取一个唯一的key, 通过这个key,去获取需要的业务数据。

b. 需求是统计鱼体重为 1-100g ,101-200g ....的占比, 我们知道 开发中是不会使用魔法值的,
那这个1、100、101、200怎么定义呢?难道有多少个数字就定义多少个常量吗? 
这个时候我们也可以使用上table, rowKey我们自己去定义,两个范围就可以分别存放在Col和Value里面
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  
		//      row    col        value
        Table<String, String, List<Object>> tables = HashBasedTable.create();
        tables.put("阿里", "java", Lists.newArrayList(1));
        tables.put("腾讯", "java", Lists.newArrayList(2));
        tables.put("腾讯", "python", Lists.newArrayList(3));

        List<Object> tableResult = tables.get("腾讯", "java");
        for (Object o : tableResult) {
            System.out.println("table-----"+o);
        }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

4. guava的文件读写 代码非常简洁


        File input = new File("C:\\Windows\\System32\\drivers\\etc\\hosts");
        // 会自动关闭流
        List<String> files = Files.readLines(input, Charsets.UTF_8);
        //由于是按行读取,所以这里只有加上"\n"才能保证这个字符串和文本内容完全一致
        String text = Joiner.on("\n").join(files);
        System.out.println(text);

       File output = new File("F:\\logs\\b.txt");
       Files.write(text.getBytes(), output);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. guava的 本地缓存

        LoadingCache<String, Object> cache = CacheBuilder.newBuilder()
                // 指定并发级别
                .concurrencyLevel(8)
                // 初始化大小 配合并发级别做分段锁
                .initialCapacity(60)
                //设置缓存大小
                .maximumSize(1000)
                //同步刷新 刷新过程中会阻塞 值到新的值出来
                .expireAfterWrite(1, TimeUnit.SECONDS)
                //异步刷新  如果是在刷新过程中 会取到旧值 需要重写reload方法
//                    .refreshAfterWrite(2, TimeUnit.SECONDS)
                //开启缓存的统计功能
                .recordStats()
                //移除时的监听任务
                //.removalListener()
                //构建缓存
                .build(new CacheLoader<String, Object>() {
                    //此处实现如果根据key找不到value需要去如何获取
                    @Override
                    public Object load(String s) throws Exception {
                        return "load值";
                    }

                    //如果批量加载有比反复调用load更优的方法则重写这个方法
                    @Override
                    public Map<String, Object> loadAll(Iterable<? extends String> keys) throws Exception {
                        return super.loadAll(keys);
                    }
                });


        cache.put("1", "1");

        try {

            while (true) {
                Object o = cache.get("1");
                Thread.sleep(1000);
                System.out.println(o);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

6. guava还提供了map 求差异结果等方法

但是仅针对简单格式的map , 复杂情况下 例如map<String,List < Entity> >,它并不会把list中具体项给返回 所以就不细讲了

7. guava的base64处理

随着jdk版本的升级 变更 ,用jdk自带的base64很可能在升级后就找不到包路径了, 干脆使用guava的工具类 以逸待劳

```
	    String url = "test";
        String encode= BaseEncoding.base64().encode(url.getBytes());
        String decode = new String(BaseEncoding.base64().decode(encode));

```
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

8. 驼峰下划线互转

        String column = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "testFish");
        // colunm : test_fish
        		
		String field = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "meng_qiu") 
		// field : mengQiu
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/828834
推荐阅读
  

闽ICP备14008679号