工具篇:介绍几个好用的guava工具类
前言
平时我们都会封装一些处理缓存或其他的小工具。但每个人都封装一次,重复造轮子,有点费时间。有没有一些好的工具库推荐-guava。guava是谷歌基于java封装好的开源库,它的性能、实用性,比我们自己造的轮子更好,毕竟谷歌出品,下面介绍下几个常用的guava工具类
- LoadingCache(本地缓存)
- Multimap 和 Multiset
- BiMap
- Table(表)
- Sets和Maps(交并差)
- EventBus(事件)
- StopWatch(秒表)
- Files(文件操作)
- RateLimiter(限流器)
- Guava Retry(重试)
关注公众号,一起交流,微信搜一搜: 潜行前行
guava的maven配置引入
LoadingCache
- LoadingCache 在实际场景中有着非常广泛的使用,通常情况下如果遇到需要大量时间计算或者缓存值的场景,就应当将值保存到缓存中。LoadingCache 和 ConcurrentMap 类似,但又不尽相同。最大的不同是 ConcurrentMap 会永久的存储所有的元素值直到他们被显示的移除,但是 LoadingCache 会为了保持内存使用合理会根据配置自动将过期值移除
- 通常情况下,Guava caching 适用于以下场景:
- 花费一些内存来换取速度
- 一些 key 会被不止一次被调用
- 缓存内容有限,不会超过内存空间的值,Guava caches 不会存储内容到文件或者到服务器外部,如果有此类需求考虑使用 Memcached, Redis
- LoadingCache 不能缓存 null key
- CacheBuilder 构造 LoadingCache 参数介绍
CacheBuilder 方法参数 | 描述 |
---|---|
initialCapacity(int initialCapacity) | 缓存池的初始大小 |
concurrencyLevel(int concurrencyLevel) | 设置并发数 |
maximumSize(long maximumSize) | 缓存池大小,在缓存项接近该大小时, Guava开始回收旧的缓存项 |
weakValues() | 设置value的存储引用是虚引用 |
softValues() | 设置value的存储引用是软引用 |
expireAfterWrite(long duration, TimeUnit unit) | 设置时间对象没有被写则对象从内存中删除(在另外的线程里面不定期维护) |
expireAfterAccess(long duration, TimeUnit unit) | 设置时间对象没有被读/写访问则对象从内存中删除(在另外的线程里面不定期维护) |
refreshAfterWrite(long duration, TimeUnit unit) | 和expireAfterWrite类似,不过不立马移除key,而是在下次更新时刷新,这段时间可能会返回旧值 |
removalListener( RemovalListener<? super K1, ? super V1> listener) | 监听器,缓存项被移除时会触发 |
build(CacheLoader<? super K1, V1> loader) | 当数据不存在时,则使用loader加载数据 |
- LoadingCache
V get(K key)
, 获取缓存值,如果键不存在值,将调用CacheLoader的load方法加载新值到该键中 - 示例
Multimap 和 MultiSet
- Multimap的特点其实就是可以包含有几个重复Key的value,可以put进入多个不同value但是相同的key,但是又不会覆盖前面的内容
- 示例
- MultiSet 有一个相对有用的场景,就是跟踪每种对象的数量,所以可以用来进行数量统计
- 示例
BiMap
- BiMap的键必须唯一,值也必须唯一,可以实现value和key互转
- 示例
Table
Table<R,C,V> table = HashBasedTable.create();
,由泛型可以看出,table由双主键R(行),C(列)共同决定,V是存储值- 新增数据:
table.put(R,C,V)
- 获取数据:
V v = table.get(R,C)
- 遍历数据:
Set<R> set = table.rowKeySet(); Set<C> set = table.columnKeySet();
- 示例
Sets和Maps
set的交集, 并集, 差集
map的交集,并集,差集
EventBus
- EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式
- EventBus内部实现原理不复杂,EventBus内部会维护一个Multimap<Class<?>, Subscriber> map,key就代表消息对应的类(不同消息不同类,区分不同的消息)、value是一个Subscriber,Subscriber其实就是对应消息处理者。如果有消息发布就去这个map里面找到这个消息对应的Subscriber去执行
- 使用示例
StopWatch
Files文件操作
- 数据写入
- 文本数据读取
- 其他操作
方法 | 描述 |
---|---|
Files.copy(File from, File to) | 复制文件 |
Files.deleteDirectoryContents(File directory) | 删除文件夹下的内容(包括文件与子文件夹) |
Files.deleteRecursively(File file) | 删除文件或者文件夹 |
Files.move(File from, File to) | 移动文件 |
Files.touch(File file) | 创建或者更新文件的时间戳 |
Files.getFileExtension(String file) | 获得文件的扩展名 |
Files.getNameWithoutExtension(String file) | 获得不带扩展名的文件名 |
Files.map(File file, MapMode mode) | 获取内存映射buffer |
RateLimiter
- 使用示例
- 因为RateLimiter滞后处理的,所以第一次无论取多少都是零秒
- 可以看到前四次的acquire,花了三秒时间去预热数据,在第五次到第八次的acquire耗时趋于平滑
Guava Retry
- maven引入
- RetryerBuilder 构造方法
RetryerBuilder方法 | 描述 |
---|---|
withRetryListener | 重试监听器 |
withWaitStrategy | 失败后重试间隔时间 |
withStopStrategy | 停止策略 |
withBlockStrategy | 阻塞策略BlockStrategy |
withAttemptTimeLimiter | 执行时间限制策略 |
retryIfException | 发生异常,则重试 |
retryIfRuntimeException | 发生RuntimeException异常,则重试 |
retryIfExceptionOfType(Class<? extends Throwable> ex) | 发生ex异常,则重试 |
retryIfException(Predicate<Throwable> exceptionPredicate) | 对异常判断,是否重试 |
retryIfResult(Predicate<V> resultPredicate) | 对返回结果判断,是否重试 |
- spring也有对应的重试机制,相关文章可以看看重试框架Guava-Retry和spring-Retry
欢迎指正文中错误(故事纯属虚构,如有雷同纯属巧合)
参考文章
__EOF__
本文作者:潜行前行
本文链接:https://www.cnblogs.com/cscw/p/14899119.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/cscw/p/14899119.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY