当前位置: 首页 > news >正文

推荐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还是习惯了使用hutoolstrUtil,很符合我的代码编程习惯。

Collections

  1. ImmutableList

不可变集合是Guava的一个重要特性,它可以确保集合不被修改,从而避免并发访问的问题

List<String> list = Lists.newArrayList("a", "b", "c");
ImmutableList<String> immutableList = ImmutableList.copyOf(list);
  1. Iterables

获得元素的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提供的一个缓存工具类,它可以帮助我们在内存中缓存数据。

  1. 缓存加载:指定缓存加载机制。可以通过传递一个 CacheLoader 对象来定义如何加载缓存中不存在的数据。CacheLoader 是一个抽象类,需要实现 load 方法,用于根据键加载对应的值。
  2. 缓存大小限制:设置缓存的最大容量,当缓存超过设定的容量时,可以通过一些策略(比如使用 LRU 或 FIFO)来自动淘汰一些不常用的缓存项。可以使用 maximumSize 方法设置缓存的最大容量。
  3. 过期时间:为缓存项设置过期时间。可以通过 expireAfterWrite 或 expireAfterAccess 方法设置缓存项的写入或访问后的过期时间。
  4. 弱引用键或值:CacheBuilder 提供了一些选项,可以使用弱引用持有缓存的键或值。当没有其他地方引用某个键或值时,缓存会自动将其从内存中移除,以避免内存泄漏。
  5. 统计信息: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核心库&#xff0c;它提供了许多实用的工具和辅助类&#xff0c;使Java开发更加简洁、高效、可靠。目前和hutool一起&#xff0c;是业界常用的工具类库。shigen也比较喜欢使用&#xff0c;在这里列举一下常用的工具类库和使用的案例。 参考…...

stencilJs学习之构建 Drawer 组件

前言 在之前的学习中&#xff0c;我们已经掌握了 stencilJs 中的一些核心概念和基础知识&#xff0c;如装饰器 Prop、State、Event、Listen、Method、Component 以及生命周期方法。这些知识是构建复杂组件和应用的基础&#xff0c;而抽屉组件是一个很好的示例&#xff0c;能够…...

hbase 国内镜像 极速下载

文章目录 国内镜像汇总-极速下载【JavaPub版】 lucene国内镜像 https://mirrors.cloud.tencent.com/apache/hbase/ 国内镜像汇总-极速下载【JavaPub版】...

Linux驱动——Tiny4412芯片_Source Insight的下载+Linux3.5内核下工程的创建

文章目录 前言Source Insight的下载1.下载地址2.下载步骤 linux3.5内核下工程的创建 前言 本博客仅作为笔记总结&#xff0c;以及帮助有需要的人&#xff0c;不作权威解释。 Source Insight的下载 1.下载地址 官网&#xff1a;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版本&#xff0c;使用gcc --version进行检查&#xff0c;版本在5以下的&#xff0c;安装redis要安装redis6以下的版本 如果没有gcc命令&#xff0c;要先安装gcc命令。因为是离线环境&#xff0c;yum命令什么的用不了。为了安装gcc&#xff0c;进行了几种尝试。 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证书 整体流程为&#xff1a; 1、页面访问为https&#xff0c;在电脑修改hosts文件&#xff0c;如域名为 babaozhou.com, 则配置为 ip1 babaozhou.com&#xff0c;ip2 babaozhou.com&#xff1b; 也就是说同域名关联两个ip&#xff0c;这样如果服务器1ping不通了则可…...

java入坑之网络编程

一、 网络基础知识 1.1网卡 1.2IP地址 1.3端口 1.4保留IP 1.5网络协议 二、UDP 编程 2.1相关概念 计算机通讯&#xff1a;数据从一个IP的port出发&#xff08;发送方&#xff09;&#xff0c;运输到另外一个IP的port&#xff08;接收方&#xff09; UDP&#xff1a;无连接无…...

A Survey on Large Language Model based Autonomous Agents

本文是LLM系列的文章&#xff0c;针对《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&#xff1a;有返回值&#xff0c;所谓有返回值&#xff0c;即不对原始多维数组进行修改&#xff1b; resize&#xff1a;无返回值&#xff0c;所谓无返回值&#xff0c;即会对原始多维数组进行修改&#xff1b;...

JPA在不写sql的情况下实现模糊查询

本文已收录于专栏 《Java》 目录 背景介绍概念说明单字段模糊匹配&#xff1a;多字段模糊匹配&#xff1a; 实现过程代码实现1.写一个实体类去实现Specification接口&#xff0c;重写toPredicate方法2.定义一个接口去继承JpaRepository接口&#xff0c;并指定返回的类型和参数类…...

Java设计模式之单例模式

单例模式是一种设计模式&#xff0c;它的目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。这个模式通常在需要控制资源访问权、限制实例化数量或实现全局共享时使用。 在实现单例模式时&#xff0c;一般会定义一个私有的构造函数&#xff0c;以防…...

Vue3 学习

基础 js:https://www.bilibili.com/video/BV15T411j7pJ/?spm_id_from333.337.search-card.all.click&vd_source9747207be61edfe4ec62226fc79b3589 官方文档&#xff1a; https://cn.vuejs.org/ 版本之间差异在关于---》版本发布 https://cn.vuejs.org/about/release…...

Error obtaining UI hierarchy Error taking device screenshot: EOF/NULL 解决办法

RT&#xff1a;Error obtaining UI hierarchy Error taking device screenshot: EOF/NULL 解决办法 关于monitor开发神器我就不多说了&#xff0c;但是假如我们在开发中遇到如上问题该怎么处理呢&#xff1f;别慌下面会有方法&#xff0c;不过不是对任何机型都有效&#xff0c…...

Java框架之王:Spring的崛起与进化

在Java世界中&#xff0c;Spring框架无疑已经成为了一个传奇。它为开发者提供了强大的工具和丰富的功能&#xff0c;使得构建高质量、可扩展的Java应用程序变得轻松便捷。本文将带您领略Spring的魅力&#xff0c;以及它在过去几年中的崛起和进化。 一、Spring的崛起 Spring框…...

【位运算】位运算常用技巧总结

目录 前言 一.常见的小问题 1.给定一个数n,确定它的二进制表示中的第x位是0还是1 2.给定一个数n&#xff0c;将它的二进制表示中的第x位修改成1 3.给定一个数n&#xff0c;将它的二进制表示中的第x位修改成0 4.给定一个数n&#xff0c;提取它的二进制表示中最右侧的1&…...

【STM32】IIC使用中DMA传输时 发送数据总少一个的问题

问题描述 在使用STM32 I2C数据发送过程中&#xff0c;发现每轮实际发送出去的数据总比在DMA配置中设定的传输数据个数要少一个。比方说&#xff1a;DMA配置里设定的传输数据个数是10个&#xff0c;结果发现在总线上只能发出9个&#xff0c;经过进一步发现是少了最后一个数据。…...

JS逆向新手也能搞定:手把手教你用Node.js补全ali140滑块canvas环境(附完整代码)

JS逆向新手也能搞定&#xff1a;手把手教你用Node.js补全ali140滑块canvas环境&#xff08;附完整代码&#xff09; 第一次接触JS逆向时&#xff0c;看到那些复杂的加密逻辑和环境检测代码&#xff0c;确实让人望而生畏。特别是遇到canvas这种需要模拟浏览器环境的场景&#xf…...

Granite TimeSeries FlowState R1 模型效果深度评测:与传统统计方法的对比

Granite TimeSeries FlowState R1 模型效果深度评测&#xff1a;与传统统计方法的对比 时间序列预测这事儿&#xff0c;听起来挺专业&#xff0c;其实离我们生活很近。比如&#xff0c;电商平台要预测下个月的销售额&#xff0c;电力公司要预估明天的用电负荷&#xff0c;甚至…...

3分钟快速上手:text-generation-webui大模型本地部署完全指南

3分钟快速上手&#xff1a;text-generation-webui大模型本地部署完全指南 【免费下载链接】text-generation-webui A Gradio web UI for Large Language Models. Supports transformers, GPTQ, AWQ, EXL2, llama.cpp (GGUF), Llama models. 项目地址: https://gitcode.com/Gi…...

别再只盯着YOLOv5了!聊聊FPN、PANet这些‘特征融合’老将如何帮你搞定小目标检测

小目标检测实战&#xff1a;FPN与PANet如何突破YOLO系列的性能瓶颈 在工业质检项目中&#xff0c;我们团队曾遇到一个典型问题&#xff1a;使用YOLOv5s模型检测电路板元件时&#xff0c;虽然大尺寸的电容电阻识别准确率超过95%&#xff0c;但0402封装的微型贴片元件&#xff08…...

OpenClaw私有化方案:Qwen3-VL:30B+飞书自动化助手实战

OpenClaw私有化方案&#xff1a;Qwen3-VL:30B飞书自动化助手实战 1. 为什么选择私有化AI助手 去年我接手了一个特殊项目&#xff1a;需要将公司内部的技术文档自动整理成知识库&#xff0c;并推送到飞书文档。这个需求看似简单&#xff0c;但涉及几个棘手问题&#xff1a;文档…...

5个技巧让普通鼠标在Mac上秒变专业工具:Mac Mouse Fix深度解析

5个技巧让普通鼠标在Mac上秒变专业工具&#xff1a;Mac Mouse Fix深度解析 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是否曾为Mac上的鼠标体验感到沮…...

ESP32智能语音助手创新实践:从技术原理到跨设备协同

ESP32智能语音助手创新实践&#xff1a;从技术原理到跨设备协同 【免费下载链接】xiaozhi-esp32 Build your own AI friend 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 随着物联网技术的飞速发展&#xff0c;智能语音交互已成为连接物理世界与数…...

Reachability.swift终极指南:现代iOS应用网络状态管理完全解析

Reachability.swift终极指南&#xff1a;现代iOS应用网络状态管理完全解析 【免费下载链接】Reachability.swift Replacement for Apples Reachability re-written in Swift with closures 项目地址: https://gitcode.com/gh_mirrors/re/Reachability.swift Reachabilit…...

Chandra AI性能调优:GPU显存优化全攻略

Chandra AI性能调优&#xff1a;GPU显存优化全攻略 1. 引言 跑大模型最头疼的是什么&#xff1f;对&#xff0c;就是那个让人又爱又恨的GPU显存&#xff01;明明买了张不错的显卡&#xff0c;结果跑个模型就提示"Out of Memory"&#xff0c;这种经历想必很多朋友都…...

UniHacker技术探索:Unity引擎全功能体验与开源研究指南

UniHacker技术探索&#xff1a;Unity引擎全功能体验与开源研究指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 一、核心价值解析&#xff1a;技术研究视…...