guava可以用来干啥?

2022年 10月 13日 70点热度 0人点赞

Guava 项目是 Google 公司开源的 Java 核心库, 它主要是包含一些在 Java 开发中经常使用到的功能, 如数据校验, 不可变集合, 计数集合, 集合增强操作, I/O, 缓存, 字符串操作等. 并且 Guava 广泛用于 Google 内部的 Java 项目中, 也被其他公司广泛使用, 甚至在新版 JDK 中直接引入了 Guava 中的优秀类库, 所以质量毋庸置疑.

数据校验

非空判断

String param = " 未读代码";
String name = Preconditions.checkNotNull(param);
System.out.println(name); // 未读代码
String param2 = null;
String name2 = Preconditions.checkNotNull(param2); // NullPointerException
System.out.println(name2);

引入了 Guava 后可以直接使用 Preconditions.checkNotNull 进行非空判断, 好处为觉得有两个, 一是语义清晰代码优雅; 二是你也可以自定义报错信息, 这样如果参数为空, 报错的信息清晰, 可以直接定位到具体参数.

缓存

Guava Cache 是一个全内存的本地缓存实现, 它提供了线程安全的实现机制.

字符串处理

  • 拼接: Joiner 可以快速地把多个字符串或字符串数组连接成为用特殊符号连接的字符串.
  • 分割: Splitter 用来分割字符串
  • 匹配: CharMatcher 常用来从字符串里面提取特定字符串.

EventBus 消息总线

EventBus 是 Guava 提供的消息发布-订阅类库, 它的工作机制类似于观察者模式, 通过通知者去注册观察者, 最后由通知者向观察者发布消息.
如果你需要订阅某种类型的消息, 只需要在指定的方法上加上 @Subscribe 注解即可.

一个观察者可以订阅多个发布者, 一个发布者可以推送给多个观察者, 实现了解耦.

EventBus 另有异步实现: AsyncEventBus

另一个更加专业, 更加强大, 更加高效, 基于内存的消息处理框架是来自 LMAX(伦敦外汇黄金交易所) 的:Disruptor.

秒表

我们经常使用 System.currentTimeMillis() 来计算某段代码执行的实现, Stopwatch 可以很方便的实现同样的功能.

算法

布隆过滤

布隆过滤器用于判断一个元素是否在一个超大的集合中. 哈希表也能用于判断元素是否在集合中, 但是布隆过滤器只需要哈希表的 1/8 或 1/4 的空间复杂度就能完成同样的功能.

Guava 中的布隆过滤实现:

com.google.common.hash.BloomFilter

限流算法

Guava 中提供了 RateLimiter 类, 它经常用于限制对一些物理资源或者逻辑资源的访问速率.

线程

com.google.common.util.concurrent 目录下是各种线程工具类.

集合

各种以 S 结尾的工厂类简化了集合的创建. 在创建泛型实例的时候, 它们使代码更加简洁

不可变的集合

创建不可变集合是我个人最喜欢 Guava 的一个原因, 因为创建一个不能删除, 不能修改, 不能增加元素的集合实在是太实用了. 这样的集合你完全不用担心发生什么问题, 总的来说有下面几个优点:

  • 线程安全, 因为不能修改任何元素, 可以随意多线程使用且没有并发问题.
  • 可以无忧的提供给第三方使用, 反正修改不了.
  • 减少内存占用, 因为不能改变, 所以内部实现可以最大程度节约内存占用.
  • 可以用作常量集合.

创建方式

说了那么多, 那么到底怎么使用呢? 赶紧撸起代码来.

// 创建方式 1:of
ImmutableSet<String> immutableSet = ImmutableSet.of("a", "b", "c");
immutableSet.forEach(System.out::println);
// a
// b
// c

// 创建方式 2:builder
ImmutableSet<String> immutableSet2 = ImmutableSet.<String>builder()
    .add("hello")
    .add(new String(" 未读代码"))
    .build();
immutableSet2.forEach(System.out::println);
// hello
// 未读代码

// 创建方式 3: 从其他集合中拷贝创建
ArrayList<String> arrayList = new ArrayList();
arrayList.add("www.wdbyte.com");
arrayList.add("https");
ImmutableSet<String> immutableSet3 = ImmutableSet.copyOf(arrayList);
immutableSet3.forEach(System.out::println);
// www.wdbyte.com
// https

都可以正常打印遍历结果, 但是如果进行增删改, 会直接报 UnsupportedOperationException.

注意事项

  • 使用 Guava 创建的不可变集合是拒绝 null 值的, 因为在 Google 内部调查中, 95% 的情况下都不需要放入 null 值.
  • 使用 JDK 提供的不可变集合创建成功后, 原集合添加元素会体现在不可变集合中, 而 Guava 的不可变集合不会有这个问题.

file

rainbow

这个人很懒,什么都没留下

文章评论