推荐Java开发常用的工具类库google guava
Guava
Guava是一个Google开源的Java核心库,它提供了许多实用的工具和辅助类,使Java开发更加简洁、高效、可靠。目前和hutool一起,是业界常用的工具类库。shigen也比较喜欢使用,在这里列举一下常用的工具类库和使用的案例。
参考:
- 整理一波Guava的使用技巧 - 掘金
- Guava中这些Map的骚操作,让我的代码量减少了50% - 掘金
pom依赖
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.1.1-jre</version>
</dependency>
Map
Table-双键map
Table 接口可以看作是一个类似于矩阵的数据结构,它包含两个键:行键和列键。它的主要特点是可以通过两个键来定位和访问值, 它的类型:Table<R,C,V>
基础的api
行列的转制
public static <R, C, V> Table<C, R, V> transpose(Table<R, C, V> table) {return (Table)(table instanceof Tables.TransposeTable ? ((Tables.TransposeTable)table).original : new Tables.TransposeTable(table));
}
转换成嵌套的map
Map<String, Map<String, Integer>> rowMap = table.rowMap();
Map<String, Map<String, Integer>> columnMap = table.columnMap();
BiMap-双向map
根据value快速找到key,所以要求key 和value都是唯一的
- 用
inverse方法反转了原来BiMap的键值映射,但是这个反转后的BiMap并不是一个新的对象,它实现了一种视图的关联,所以对反转后的BiMap执行的所有操作会作用于原先的BiMap上。 - 继承hashMap,key、value都不能重复的
MultiMap-多值map
一个键映射到多个值上,底层是Map<String, List>
创建和转换
Multimap<String, String> multiMap = ArrayListMultimap.create();
multiMap.putAll("name", Arrays.asList("shigen", "aaa", "bbb"));
Collection<String> names = multiMap.get("name");
Map<String, Collection<String>> stringCollectionMap = multiMap.asMap();
RangeMap-范围map
RangeMap描述了一种从区间到特定值的映射关系,让我们能够以更为优雅的方法来书写代码
分数段判断案例
‘com.google.common.collect.RangeMap’ is marked unstable with @Beta
shigen觉得这个很好用,为我们省略了很多根据区间判断的if-else代码
RangeMap<Integer, String> rangeMap = TreeRangeMap.create();
rangeMap.put(Range.closedOpen(0,60),"fail");
rangeMap.put(Range.closed(60,90),"satisfactory");
rangeMap.put(Range.openClosed(90,100),"excellent");System.out.println(rangeMap.get(59));
System.out.println(rangeMap.get(60));
System.out.println(rangeMap.get(90));
System.out.println(rangeMap.get(91));
ClassToInstanceMap-实例Map
它的键是Class,而值是这个Class对应的实例对象(Map<Class, List<Object>)。取出对象时省去了强制类型转换,避免手动类型转换失误。
适合缓存对象,但是又不想做复杂的校验
MutableClassToInstanceMap<List> listMutableClassToInstanceMap = MutableClassToInstanceMap.create();
ArrayList<String> strings = new ArrayList<>();
strings.add("1111");
listMutableClassToInstanceMap.putInstance(ArrayList.class, strings);
ArrayList instance = listMutableClassToInstanceMap.getInstance(ArrayList.class);
// true
System.out.println(strings == instance);
Strings
isNullOrEmpty(String string):判断字符串是否为空或null。padEnd(String string, int minLength, char padChar):在字符串末尾填充指定字符,直到字符串达到指定长度。padStart(String string, int minLength, char padChar):在字符串开头填充指定字符,直到字符串达到指定长度。repeat(String string, int count):重复指定字符串指定次数。commonPrefix(CharSequence a, CharSequence b):获取两个字符串的最长公共前缀。commonSuffix(CharSequence a, CharSequence b):获取两个字符串的最长公共后缀。
这一块
shigen还是习惯了使用hutool的strUtil,很符合我的代码编程习惯。
Collections
不可变集合是Guava的一个重要特性,它可以确保集合不被修改,从而避免并发访问的问题
List<String> list = Lists.newArrayList("a", "b", "c");
ImmutableList<String> immutableList = ImmutableList.copyOf(list);
获得元素的API
获得符合条件的元素
转换集合类型
条件检查(Preconditions)
Preconditions是Guava提供的一组前置条件检查工具,它提供了一些检查参数是否符合预期的方法。
shigen觉得这个和assert很相像。
以下是Preconditions的主要方法:
checkArgument(boolean expression, String errorMessageTemplate, Object... errorMessageArgs):检查参数是否符合预期,并抛出IllegalArgumentException异常,可以包含错误信息模板和占位符。checkNotNull(T reference, String errorMessageTemplate, Object... errorMessageArgs):检查参数是否为null,并抛出NullPointerException异常,可以包含错误信息模板和占位符。checkState(boolean expression, String errorMessageTemplate, Object... errorMessageArgs):检查对象状态是否符合预期,并抛出IllegalStateException异常,可以包含错误信息模板和占位符。checkElementIndex(int index, int size, String errorMessageTemplate, Object... errorMessageArgs):检查下标是否在集合的范围内,并抛出IndexOutOfBoundsException异常,可以包含错误信息模板和占位符。checkPositionIndex(int index, int size, String errorMessageTemplate, Object... errorMessageArgs):检查下标是否在集合的范围内,可以等于集合的大小,并抛出IndexOutOfBoundsException异常,可以包含错误信息模板和占位符。checkPositionIndexes(int start, int end, int size):检查开始下标和结束下标是否在集合的范围内,并抛出IndexOutOfBoundsException异常。
public class PreconditionsDemo {public static void main(String[] args) {// 检查参数是否符合预期,并抛出IllegalArgumentException异常,可以包含错误信息模板和占位符String str1 = "abc";Preconditions.checkArgument(str1.length() < 3, "字符串长度必须小于3");// 检查参数是否为null,并抛出NullPointerException异常,可以包含错误信息模板和占位符String str2 = null;Preconditions.checkNotNull(str2, "字符串不能为空");// 检查对象状态是否符合预期,并抛出IllegalStateException异常,可以包含错误信息模板和占位符boolean flag1 = false;Preconditions.checkState(flag1, "状态不正确");// 检查下标是否在集合的范围内,并抛出IndexOutOfBoundsException异常,可以包含错误信息模板和占位符List<Integer> list1 = Lists.newArrayList(1, 2, 3, 4, 5);Preconditions.checkElementIndex(6, list1.size(), "下标越界");// 检查下标是否在集合的范围内,可以等于集合的大小,并抛出IndexOutOfBoundsException异常,可以包含错误信息模板和占位符List<Integer> list2 = Lists.newArrayList(1, 2, 3, 4, 5);Preconditions.checkPositionIndex(5, list2.size(), "下标越界");// 检查开始下标和结束下标是否在集合的范围内,并抛出IndexOutOfBoundsException异常List<Integer> list3 = Lists.newArrayList(1, 2, 3, 4, 5);Preconditions.checkPositionIndexes(2, 6, list3.size());// 可以在错误信息中使用占位符int value1 = 101;Preconditions.checkArgument(value1 <= 100, "值必须小于等于 %s", 100);// 可以使用Supplier来避免计算开销int value2 = 101;Preconditions.checkArgument(value2 <= 100, () -> "值必须小于等于 " + 100);
}
cacheBuilder
Cache是Guava提供的一个缓存工具类,它可以帮助我们在内存中缓存数据。
- 缓存加载:指定缓存加载机制。可以通过传递一个 CacheLoader 对象来定义如何加载缓存中不存在的数据。CacheLoader 是一个抽象类,需要实现 load 方法,用于根据键加载对应的值。
- 缓存大小限制:设置缓存的最大容量,当缓存超过设定的容量时,可以通过一些策略(比如使用 LRU 或 FIFO)来自动淘汰一些不常用的缓存项。可以使用 maximumSize 方法设置缓存的最大容量。
- 过期时间:为缓存项设置过期时间。可以通过 expireAfterWrite 或 expireAfterAccess 方法设置缓存项的写入或访问后的过期时间。
- 弱引用键或值:CacheBuilder 提供了一些选项,可以使用弱引用持有缓存的键或值。当没有其他地方引用某个键或值时,缓存会自动将其从内存中移除,以避免内存泄漏。
- 统计信息:CacheBuilder 提供了一些统计信息,包括缓存的命中率、加载次数、加载成功率等。可以通过调用 recordStats 方法开启统计信息的收集。
@SneakyThrows
private static void testCache() {// 创建一个缓存实例Cache<String, String> cache = CacheBuilder.newBuilder()// 最大容量为100个缓存项.maximumSize(100)// 10分钟后过期.expireAfterWrite(10, TimeUnit.MINUTES).build();// 向缓存中存入数据cache.put("key1", "value1");cache.put("key2", "value2");// 从缓存中获取数据String value1 = cache.getIfPresent("key1");// 输出: Value1: value1System.out.println("Value1: " + value1);// 存中存在,则返回对应的值;如果缓存中不存在,则使用提供的函数加载新的值,并将其添加到缓存中String value3 = cache.get("key3", () -> "value3");// 输出: Value3: value3System.out.println("Value3: " + value3);// 获取缓存的统计信息CacheStats stats = cache.stats();// 输出: Hit Rate: 1.0System.out.println("Hit Rate: " + stats.hitRate());
}
以上就是这些常用的使用场景了。也欢迎伙伴们交流一下常用的工具库的方法。
与shigen一起,每天不一样!
相关文章:
推荐Java开发常用的工具类库google guava
Guava Guava是一个Google开源的Java核心库,它提供了许多实用的工具和辅助类,使Java开发更加简洁、高效、可靠。目前和hutool一起,是业界常用的工具类库。shigen也比较喜欢使用,在这里列举一下常用的工具类库和使用的案例。 参考…...
stencilJs学习之构建 Drawer 组件
前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop、State、Event、Listen、Method、Component 以及生命周期方法。这些知识是构建复杂组件和应用的基础,而抽屉组件是一个很好的示例,能够…...
hbase 国内镜像 极速下载
文章目录 国内镜像汇总-极速下载【JavaPub版】 lucene国内镜像 https://mirrors.cloud.tencent.com/apache/hbase/ 国内镜像汇总-极速下载【JavaPub版】...
Linux驱动——Tiny4412芯片_Source Insight的下载+Linux3.5内核下工程的创建
文章目录 前言Source Insight的下载1.下载地址2.下载步骤 linux3.5内核下工程的创建 前言 本博客仅作为笔记总结,以及帮助有需要的人,不作权威解释。 Source Insight的下载 1.下载地址 官网:https://www.sourceinsight.com/ 另外可以选择…...
rust交叉编译 在mac下编译linux和windows
系统版本macbook proVentura 13.5linux ubuntu22.04.3 LTS/18.04.6 LTSwindowswindows 10 专业版 20H2mac下rustc --versionrustc 1.74.0-nightly (58eefc33a 2023-08-24)查看当前系统支持的交叉编译指定系统版本列表 rustup target list如果已经安装这里会显示(installed)。…...
linux离线环境安装redis
先检查gcc版本,使用gcc --version进行检查,版本在5以下的,安装redis要安装redis6以下的版本 如果没有gcc命令,要先安装gcc命令。因为是离线环境,yum命令什么的用不了。为了安装gcc,进行了几种尝试。 1、下…...
记录学习--字节码解析try catch
1.示例代码 Testpublic void someTest() {String s "111";try {s "222";int i 1/0;} catch (Exception e){e.printStackTrace();System.out.println(s);}System.out.println(s);}2.示例代码对应的字节码 0 ldc #2 <111>2 astore_13 ldc #3 <22…...
多线程与高并发——并发编程(3)
文章目录 三、锁1 锁的分类1.1 可重入锁、不可重入锁1.2 乐观锁、悲观锁1.3 公平锁、非公平锁1.4 互斥锁、共享锁2 深入synchronized2.1 类锁、对象锁2.2 synchronized的优化2.3 synchronized实现原理2.4 synchronized的锁升级2.5 重量级锁底层 ObjectMonitor3 深入ReentrantLo…...
关于内网主备+https
先openssl证书 整体流程为: 1、页面访问为https,在电脑修改hosts文件,如域名为 babaozhou.com, 则配置为 ip1 babaozhou.com,ip2 babaozhou.com; 也就是说同域名关联两个ip,这样如果服务器1ping不通了则可…...
java入坑之网络编程
一、 网络基础知识 1.1网卡 1.2IP地址 1.3端口 1.4保留IP 1.5网络协议 二、UDP 编程 2.1相关概念 计算机通讯:数据从一个IP的port出发(发送方),运输到另外一个IP的port(接收方) UDP:无连接无…...
A Survey on Large Language Model based Autonomous Agents
本文是LLM系列的文章,针对《A Survey on Large Language Model based Autonomous Agents》的翻译。 基于大模型的自动agents综述 摘要1 引言2 基于LLM的自动代理构建3 基于LLM的自动代理应用4 基于LLM的自动代理评估5 相关综述6 挑战6.1 角色扮演能力6.2 广义与人对…...
Integer、Long 等包装类 == 值判断、地址判断与缓存
先看下以下代码和输出 public static void main(String[] args) throws Exception{Integer a-128;Integer aa-128;System.out.printf("aaa? %s \n",aaa);Integer b127;Integer bb127;System.out.printf("bbb? %s \n",bbb);Integer c128;Integer cc128;Sy…...
numpy学习:reshape和resize
.reshape 与 .resize reshape:有返回值,所谓有返回值,即不对原始多维数组进行修改; resize:无返回值,所谓无返回值,即会对原始多维数组进行修改;...
JPA在不写sql的情况下实现模糊查询
本文已收录于专栏 《Java》 目录 背景介绍概念说明单字段模糊匹配:多字段模糊匹配: 实现过程代码实现1.写一个实体类去实现Specification接口,重写toPredicate方法2.定义一个接口去继承JpaRepository接口,并指定返回的类型和参数类…...
Java设计模式之单例模式
单例模式是一种设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这个模式通常在需要控制资源访问权、限制实例化数量或实现全局共享时使用。 在实现单例模式时,一般会定义一个私有的构造函数,以防…...
Vue3 学习
基础 js:https://www.bilibili.com/video/BV15T411j7pJ/?spm_id_from333.337.search-card.all.click&vd_source9747207be61edfe4ec62226fc79b3589 官方文档: https://cn.vuejs.org/ 版本之间差异在关于---》版本发布 https://cn.vuejs.org/about/release…...
Error obtaining UI hierarchy Error taking device screenshot: EOF/NULL 解决办法
RT:Error obtaining UI hierarchy Error taking device screenshot: EOF/NULL 解决办法 关于monitor开发神器我就不多说了,但是假如我们在开发中遇到如上问题该怎么处理呢?别慌下面会有方法,不过不是对任何机型都有效,…...
Java框架之王:Spring的崛起与进化
在Java世界中,Spring框架无疑已经成为了一个传奇。它为开发者提供了强大的工具和丰富的功能,使得构建高质量、可扩展的Java应用程序变得轻松便捷。本文将带您领略Spring的魅力,以及它在过去几年中的崛起和进化。 一、Spring的崛起 Spring框…...
【位运算】位运算常用技巧总结
目录 前言 一.常见的小问题 1.给定一个数n,确定它的二进制表示中的第x位是0还是1 2.给定一个数n,将它的二进制表示中的第x位修改成1 3.给定一个数n,将它的二进制表示中的第x位修改成0 4.给定一个数n,提取它的二进制表示中最右侧的1&…...
【STM32】IIC使用中DMA传输时 发送数据总少一个的问题
问题描述 在使用STM32 I2C数据发送过程中,发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说:DMA配置里设定的传输数据个数是10个,结果发现在总线上只能发出9个,经过进一步发现是少了最后一个数据。…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
