当前位置:   article > 正文

Google guava工具类的介绍和使用

guava工具类

概述

工具类 就是封装平常用的方法,不需要你重复造轮子,节省开发人员时间,提高工作效率。谷歌作为大公司,当然会从日常的工作中提取中很多高效率的方法出来。所以就诞生了guava。
guava的优点:
1)高效设计良好的API,被Google的开发者设计,实现和使用
2)遵循高效的java语法实践
3)使代码更刻度,简洁,简单
4)节约时间,资源,提高生产力

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:
1)集合 [collections]
2)缓存 [caching]
3)原生类型支持 [primitives support]
4)并发库 [concurrency libraries]
5)通用注解 [common annotations]
6)字符串处理 [string processing]
7)I/O 等等。

使用

引入gradle依赖(引入Jar包)

compile 'com.google.guava:guava:26.0-jre'

1.集合的创建

  1. // 普通Collection的创建
  2. List<String> list = Lists.newArrayList();
  3. Set<String> set = Sets.newHashSet();
  4. Map<String, String> map = Maps.newHashMap();
  5. // 不变Collection的创建
  6. ImmutableList<String> iList = ImmutableList.of("a", "b", "c");
  7. ImmutableSet<String> iSet = ImmutableSet.of("e1", "e2");
  8. ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");
  9. // 其他的黑科技集合
  10. MultiSet: 无序+可重复 count()方法获取单词的次数 增强了可读性+操作简单
  11. 创建方式: Multiset<String> set = HashMultiset.create();
  12. Multimap: key-value key可以重复
  13. 创建方式: Multimap<String, String> teachers = ArrayListMultimap.create();
  14. Multimap<String,Integer> map = ArrayListMultimap.create();
  15. map.put("aa", 1);
  16. map.put("aa", 2);
  17. System.out.println(map.get("aa")); //[1, 2]

创建不可变集合 先理解什么是immutable(不可变)对象
1)在多线程操作下,是线程安全的
2)所有不可变集合会比可变集合更有效的利用资源

2.将集合转换为特定规则的字符串(Joiner)

  1. //use java
  2. List<String> list = new ArrayList<String>();
  3. list.add("aa");
  4. list.add("bb");
  5. list.add("cc");
  6. String str = "";
  7. for(int i=0; i<list.size(); i++){
  8. str = str + "-" +list.get(i);
  9. }
  10. //str 为-aa-bb-cc
  11. //use guava
  12. List<String> list = new ArrayList<String>();
  13. list.add("aa");
  14. list.add("bb");
  15. list.add("cc");
  16. String result = Joiner.on("-").join(list);
  17. //result为 aa-bb-cc
  18. Map<String, Integer> map = Maps.newHashMap();
  19. map.put("xiaoming", 12);
  20. map.put("xiaohong",13);
  21. String result = Joiner.on(",").withKeyValueSeparator("=").join(map);
  22. // result为 xiaoming=12,xiaohong=13

3.将String转换为特定的集合(Splitter)

  1. //use java
  2. List<String> list = new ArrayList<String>();
  3. String a = "1-2-3-4-5-6";
  4. String[] strs = a.split("-");
  5. for(int i=0; i<strs.length; i++){
  6. list.add(strs[i]);
  7. }
  8. //use guava
  9. String str = "1-2-3-4-5-6";
  10. List<String> list = Splitter.on("-").splitToList(str);
  11. //list为 [1, 2, 3, 4, 5, 6]
  12. // guava还可以使用 omitEmptyStrings().trimResults() 去除空串与空格
  13. String str = "1-2-3-4- 5- 6 ";
  14. List<String> list = Splitter.on("-").omitEmptyStrings().trimResults().splitToList(str);
  15. System.out.println(list);
  16. //String转换为map
  17. String str = "xiaoming=11,xiaohong=23";
  18. Map<String,String> map = Splitter.on(",").withKeyValueSeparator("=").split(str);
  19. // guava还支持多个字符切割,或者特定的正则分隔
  20. String input = "aa.dd,,ff,,.";
  21. List<String> result = Splitter.onPattern("[.|,]").omitEmptyStrings().splitToList(input);

9.计算中间代码的运行时间

  1. Stopwatch stopwatch = Stopwatch.createStarted();
  2. for(int i=0; i<100000; i++){
  3. // do some thing
  4. }
  5. long nanos = stopwatch.elapsed(TimeUnit.MILLISECONDS);
  6. System.out.println(nanos);

11.guava缓存

  1. // 使用Guava创建一个缓存
  2. Cache<String, String> cache = CacheBuilder.newBuilder()
  3. .maximumSize(100) // 设置缓存的最大容量
  4. .expireAfterWrite(1, TimeUnit.MINUTES) // 设置缓存在写入一分钟后失效
  5. .concurrencyLevel(10) // 设置并发级别为10
  6. .recordStats() // 开启缓存统计
  7. .build();
  8. // 放入缓存
  9. cache.put("key", "value");
  10. // 获取缓存,getIfPresent 不存在就返回null
  11. String value = cache.getIfPresent("key");
  12. CacheBuilder.newBuilder()
  13. // 设置缓存在写入10分钟后,通过CacheLoader的load方法进行刷新
  14. .refreshAfterWrite(10, TimeUnit.SECONDS)
  15. // jdk8以后可以使用 Duration
  16. // .refreshAfterWrite(Duration.ofMinutes(10))
  17. .build(new CacheLoader<String, String>() {
  18. @Override
  19. public String load(String key) throws Exception {
  20. // 缓存加载逻辑
  21. ...
  22. }
  23. });

RateLimiter限流(https://zhuanlan.zhihu.com/p/38100340)

  1. @Component("rateLimitInterceptor")
  2. public class RateLimitInterceptor extends AbstractInterceptor {
  3. /**
  4. * 单机全局限流器(限制QPS为1)
  5. */
  6. private static final RateLimiter rateLimiter = RateLimiter.create(1);
  7. @Override
  8. protected ResponseEnum preFilter(HttpServletRequest request) {
  9. if (!rateLimiter.tryAcquire()) {
  10. System.out.println("限流中......");
  11. return ResponseEnum.RATE_LIMIT;
  12. }
  13. System.out.println("请求成功");
  14. return ResponseEnum.OK;
  15. }
  16. }


 


作者:小张同学99
链接:https://www.jianshu.com/p/3c7d3fcc63cb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号