java种Hutools常用方法

目录

  • 一、依赖
  • 二、Convert
  • 三、DateUtil
  • 四、StrUtil
  • 五、ReflectUtil
  • 六、IdUtil
  • 七、RandomUtil
  • 八、BeanUtil
  • 九、JSONUtil

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅。Hutool官网
设计思想是尽量减少重复的定义,让项目中的util这个package尽量少,总的来说有如下的几个思想:

  • 方法优先于对象
  • 自动识别优于用户定义
  • 便捷性与灵活性并存
  • 适配与兼容
  • 可选依赖原则
  • 无侵入原则

一、依赖

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version>
</dependency>

二、Convert

在Java开发中我们要面对各种各样的类型转换问题,比如:数组转换成字符串,日期转换成字符串等。
我们需要手写许多代码,或者专门处理异常,比较麻烦。
而Hutool包专门提供了Convert类,我们使用它做类型转换,使用起来非常方便。
1.数字转换为字符串:

int a = 1;
//aStr为"1"
String aStr = Convert.toStr(a);

2.转换为指定类型数组:

long[] b = {1,2,3,4,5};
//bStr为:"[1, 2, 3, 4, 5]"
String bStr = Convert.toStr(b);

3.转换为指定类型数组:

String[] b = { "1", "2", "3", "4" };
//结果为Integer数组
Integer[] intArray = Convert.toIntArray(b);long[] c = {1,2,3,4,5};
//结果为Integer数组
Integer[] intArray2 = Convert.toIntArray(c);

4.转换为日期对象:

String a = "2017-05-06";
Date value = Convert.toDate(a);

5.转换为集合

Object[] a = {"a", "你", "好", "", 1};
List<?> list = Convert.convert(List.class, a);
//从4.1.11开始可以这么用
List<?> list = Convert.toList(a);

三、DateUtil

Java本身对日期时间的支持有限,并且Date和Calendar对象的并存导致各种方法使用混乱和复杂。
通常情况下,我们需要使用SimpleDateFormat类,做时间和字符串类型的转换。
其实Hutool包专门提供了DateUtil类,给我们做时间和日期类型转换的。
1.Date和Calendar相互转换

//当前时间
Date date = DateUtil.date();
//当前时间
Date date2 = DateUtil.date(Calendar.getInstance());

2.字符串转日期
将字符串转换成Date类型:

String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);

自定义时间格式做类型转换:

String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr, "yyyy-MM-dd");

3.格式化日期输出

String dateStr = "2017-03-01";
Date date = DateUtil.parse(dateStr);//结果 2017/03/01
String format = DateUtil.format(date, "yyyy/MM/dd");//常用格式的格式化,结果:2017-03-01
String formatDate = DateUtil.formatDate(date);//结果:2017-03-01 00:00:00
String formatDateTime = DateUtil.formatDateTime(date);//结果:00:00:00
String formatTime = DateUtil.formatTime(date);

4.开始和结束时间
有的时候我们需要获得每天的开始时间、结束时间,每月的开始和结束时间等等,DateUtil也提供了相关方法:

String dateStr = "2017-03-01 22:33:23";
Date date = DateUtil.parse(dateStr);//一天的开始,结果:2017-03-01 00:00:00
Date beginOfDay = DateUtil.beginOfDay(date);//一天的结束,结果:2017-03-01 23:59:59
Date endOfDay = DateUtil.endOfDay(date);

四、StrUtil

这个工具的用处类似于Apache Commons Lang中的StringUtil,常用的方法例如isBlank、isNotBlank、isEmpty、isNotEmpty。
1.hasBlank方法
就是给定一些字符串,如果一旦有空的就返回true,常用于判断好多字段是否有空的(例如web表单数据)。
这两个方法的区别是hasEmpty只判断是否为null或者空字符串(“”),hasBlank则会把不可见字符也算做空,isEmpty和isBlank同理。
2.removePrefix方法
这两个是去掉字符串的前缀后缀的,例如去个文件名的扩展名啥。

String fileName = StrUtil.removeSuffix("pretty_girl.jpg", ".jpg")  //fileName -> pretty_girl

还有忽略大小写的removePrefixIgnoreCase和removeSuffixIgnoreCase都比较实用。
3.sub方法
有人说String有了subString你还写它干啥,我想说subString方法越界啥的都会报异常,而使用StrUtil的sub就不会报错:

String str = "abcdefgh";
String strSub1 = StrUtil.sub(str, 2, 3); //strSub1 -> c
String strSub2 = StrUtil.sub(str, 2, -3); //strSub2 -> cde
String strSub3 = StrUtil.sub(str, 3, 2); //strSub2 -> c

4.format方法
灵感来自slf4j,可以使用字符串模板代替字符串拼接。

String template = "{}爱{},就像老鼠爱大米";
String str = StrUtil.format(template, "我", "你"); //str -> 我爱你,就像老鼠爱大米

五、ReflectUtil

Java的反射机制,可以让语言变得更加灵活,对对象的操作也更加“动态”,因此在某些情况下,反射可以做到事半功倍的效果。Hutool针对Java的反射机制做了工具化封装,封装包括:

  • 获取构造方法
  • 获取字段
  • 获取字段值
  • 获取方法
  • 执行方法(对象方法和静态方法)

1.获取某个类的所有方法

Method[] methods = ReflectUtil.getMethods(ExamInfoDict.class);

2.获取某个类的指定方法

Method method = ReflectUtil.getMethod(ExamInfoDict.class, "getId");

3.构造对象

ReflectUtil.newInstance(ExamInfoDict.class);

4.执行方法

class TestClass {private int a;public int getA() {return a;}public void setA(int a) {this.a = a;}
}
TestClass testClass = new TestClass();
ReflectUtil.invoke(testClass, "setA", 10);

六、IdUtil

在分布式环境中,唯一ID生成应用十分广泛,生成方法也多种多样,Hutool针对一些常用生成策略做了简单封装。
唯一ID生成器的工具类,涵盖了:

  • UUID
  • ObjectId(MongoDB)
  • Snowflake(Twitter)

1.UUID
UUID全称通用唯一识别码(universally unique identifier),JDK通过java.util.UUID提供了 Leach-Salz 变体的封装。在Hutool中,生成一个UUID字符串方法如下:

//生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid = IdUtil.randomUUID();//生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID();

说明 Hutool重写java.util.UUID的逻辑,对应类为cn.hutool.core.lang.UUID,使生成不带-的UUID字符串不再需要做字符替换,性能提升一倍左右。
2.ObjectId
ObjectId是MongoDB数据库的一种唯一ID生成策略,是UUID version1的变种,详细介绍可见:服务化框架-分布式Unique ID的生成方法一览。

Hutool针对此封装了cn.hutool.core.lang.ObjectId,快捷创建方法为:

//生成类似:5b9e306a4df4f8c54a39fb0c
String id = ObjectId.next();//方法2:从Hutool-4.1.14开始提供
String id2 = IdUtil.objectId();

3.Snowflake
分布式系统中,有一些需要使用全局唯一ID的场景,有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。Twitter的Snowflake 算法就是这种生成器。
使用方法如下:

//参数1为终端ID
//参数2为数据中心ID
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long id = snowflake.nextId();//简单使用
long id = IdUtil.getSnowflakeNextId();
String id = snowflake.getSnowflakeNextIdStr();

七、RandomUtil

RandomUtil主要针对JDK中Random对象做封装,严格来说,Java产生的随机数都是伪随机数,因此Hutool封装后产生的随机结果也是伪随机结果。不过这种随机结果对于大多数情况已经够用。
RandomUtil.randomInt 获得指定范围内的随机数 例如我们想产生一个[10, 100)的随机数,则:

int c = RandomUtil.randomInt(10, 100);

RandomUtil.randomBytes 随机bytes,一般用于密码或者salt生成

byte[] c = RandomUtil.randomBytes(10);

RandomUtil.randomEle 随机获得列表中的元素。
RandomUtil.randomEleSet 随机获得列表中的一定量的不重复元素,返回Set

Set<Integer> set = RandomUtil.randomEleSet(CollUtil.newArrayList(1, 2, 3, 4, 5, 6), 2);

八、BeanUtil

通常Java中对Bean的定义是包含setXXX和getXXX方法的对象,在Hutool中,采取一种简单的判定Bean的方法:是否存在只有一个参数的setXXX方法。
1.判断是否为Bean对象
BeanUtil.isBean方法根据是否存在只有一个参数的setXXX方法或者public类型的字段来判定是否是一个Bean对象。这样的判定方法主要目的是保证至少有一个setXXX方法用于属性注入。

boolean isBean = BeanUtil.isBean(HashMap.class);//false

2.Bean转为Map
BeanUtil.beanToMap方法则是将一个Bean对象转为Map对象。

SubPerson person = new SubPerson();
person.setAge(14);
person.setOpenid("11213232");
person.setName("测试A11");
person.setSubName("sub名字");Map<String, Object> map = BeanUtil.beanToMap(person);

3.Bean转Bean
Bean之间的转换主要是相同属性的复制,因此方法名为copyProperties,此方法支持Bean和Map之间的字段复制。
BeanUtil.copyProperties方法同样提供一个CopyOptions参数用于自定义属性复制。

SubPerson p1 = new SubPerson();
p1.setSlow(true);
p1.setName("测试");
p1.setSubName("sub测试");Map<String, Object> map = MapUtil.newHashMap();
BeanUtil.copyProperties(p1, map);

九、JSONUtil

JSONUtil是针对JSONObject和JSONArray的静态快捷方法集合。
1.JSON字符串创建
JSONUtil.toJsonStr可以将任意对象(Bean、Map、集合等)直接转换为JSON字符串。如果对象是有序的Map等对象,则转换后的JSON字符串也是有序的。

SortedMap<Object, Object> sortedMap = new TreeMap<Object, Object>() {private static final long serialVersionUID = 1L;{put("attributes", "a");put("b", "b");put("c", "c");
}};JSONUtil.toJsonStr(sortedMap);

结果:

{"attributes":"a","b":"b","c":"c"}

如果我们想获得格式化后的JSON,则:

JSONUtil.toJsonPrettyStr(sortedMap);

结果:

{"attributes": "a","b": "b","c": "c"
}

2.JSON字符串解析

String html = "{\"name\":\"Something must have been changed since you leave\"}";
JSONObject jsonObject = JSONUtil.parseObj(html);
jsonObject.getStr("name");

3.XML字符串转换为JSON

String s = "<sfzh>123</sfzh><sfz>456</sfz><name>aa</name><gender>1</gender>";
JSONObject json = JSONUtil.parseFromXml(s);json.get("sfzh");
json.get("name");

4.JSON转换为XML

final JSONObject put = JSONUtil.createObj().set("aaa", "你好").set("键2", "test");// <aaa>你好</aaa><键2>test</键2>
final String s = JSONUtil.toXmlStr(put);

5.JSON转Bean
我们定义两个较为复杂的Bean(包含泛型)

@Data
public class ADT {private List<String> BookingCode;
}@Data
public class Price {private List<List<ADT>> ADT;
}
String json = "{\"ADT\":[[{\"BookingCode\":[\"N\",\"N\"]}]]}";Price price = JSONUtil.toBean(json, Price.class);
price.getADT().get(0).get(0).getBookingCode().get(0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/798215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2-django、http、web框架、django及django请求生命周期、路由控制、视图层

1 http 2 web框架 3 django 3.1 django请求生命周期 4 路由控制 5 视图层 1 http #1 http 是什么 #2 http特点 #3 请求协议详情-请求首行---》请求方式&#xff0c;请求地址&#xff0c;请求协议版本-请求头---》key:value形式-referer&#xff1a;上一次访问的地址-user-agen…

【算法-数组】移除元素

这里写自定义目录标题 暴力解法双指针思路 leecode27 : https://leetcode.cn/problems/remove-element/submissions/521113648/ 暴力解法 循环匹配&#xff0c;每次匹配到就将数组匹配到的元素的后面元素向前移动一位 【注意】 注意最后一位元素&#xff0c;避免数组越界 pu…

tcp/ip细节

主动方: 发送fin进入fin_wait1,收到fin的ack进入fin_wait2&#xff0c;发送fin时接收缓冲区还有数据 - 应用层不读数据你就close?发reset告知对端你出问题了 默认&#xff1a;linger关闭&#xff0c;close调用立即返回(发出发送缓冲区未发出数据和fin后) linger开启&#xff0…

Sora是什么?Sora怎么使用?Sora最新案例视频以及常见问题答疑

Sora 是什么&#xff1f; 2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型Sora 这样说吧给你一段话&#xff0c; 让你写一篇800字的论文&#xff0c;你的理解很可能都有偏差&#xff0c;那么作为OpenAi要做文生视频到底有多难&#xff0c;下面…

【从零到一手撕脚手架 | 第三节】项目集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged

【从零到一手撕脚手架 | 第三节】项目集成CommitLIntESLintPrettierStyleLintLintStaged Hello大家好我是⛄&#xff0c;前两节教大家如何初始化一个脚手架项目以及如何封装Vue技术栈常用的工具库。本小节教大家如何向我们的脚手架中配置ESLint、Prettier、StyleLint、LintStag…

科研学习|研究方法——扎根理论三阶段编码如何做?

一、背景介绍 “主题标引”意指对文献内容进行分析, 然后对文献所表达的中心思想、所讨论的基本问题以及研究的对象等进行提取, 以形成主题概念, 然后在此基础上把可检索的主题词表示出来, 再将这些主题词按一定顺序 (如字顺) 排列, 对论述相同主题内容的文献加以集中, 从而提高…

Linux下场景模拟--cpu、内存打满测试

Linux下场景模拟–cpu、内存打满测试 打满CPU占用 编写脚本vi /root/cpu_run_full.sh vi /root/cpu_run_full.sh填写如下内容&#xff1a; #!/bin/bash function while_run_cpu() {while true;doi2;done }function cpu_full() {for ((i0; i<$1; i));dowhile_run_cpu &am…

css伪类:last-child或:first-child不生效

目录 一、问题 二、原因及解决方法 三、总结 tiips:如嫌繁琐&#xff0c;直接移步总结即可&#xff01; 一、问题 1.想使用伪类:last-child给 for循环出来的最后一个元素单独添加样式。但是发现无论怎么写都没有添加上去。 2.真是奇怪呀&#xff0c;明明写的没有问题呀&a…

云备份day04

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C云备份项目 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容介绍了文件工具了类的实现 文章目录 云备份day041.文件…

掌握Go语言:Go语言精细错误,清晰、高效的错误处理实践(32)

错误处理是任何编程语言中都至关重要的一部分&#xff0c;Go 语言提供了一套简单而强大的错误处理机制&#xff0c;使得处理错误变得高效而清晰。 Go 错误类型 在 Go 中&#xff0c;错误是一个普通的接口类型&#xff0c;即 error 接口&#xff0c;其定义如下&#xff1a; t…

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…

Vue3组件基础示例

组件是vue中最推崇的&#xff0c;也是最强大的功能之一&#xff0c;就是为了提高重用性&#xff0c;减少重复性的开发。 如何使用原生HTML方法实现组件化 在使用原生HTML开发时&#xff0c;我们也会遇到一些常见的功能、模块&#xff0c;那么如何在原生HTML中使用组件化呢&am…

Android OkHttp

目录 1.build.gradle 2.基本使用 3.POST请求 4.Builder构建者 1.build.gradle implementation("com.squareup.okhttp3:okhttp:4.12.0") 2.基本使用 GET同步请求 public void getSync(View view) {new Thread(){Overridepublic void run() {Request request …

C语言初阶--12数组

文章目录 二维数组的创建和初始化二维数组的创建二维数组的初始化二维数组的使用二维数组在内存中的存储 数组越界数组作为函数参数冒泡排序函数数组名是什么&#xff1f; 二维数组的创建和初始化 二维数组的创建 //数组创建 int arr[3][4]; double arr[2][4]; 二维数组的初始…

HTML中meta标签的作用

1.搜索引擎优化 通过设置关键词&#xff08;keywords&#xff09;、描述&#xff08;description&#xff09;等属性&#xff0c;帮助搜索引擎更好地理解网页内容&#xff0c;从而提高网页在搜索结果中的排名 2.定义页面使用的语言 通过charset属性指定文档的字符集&#xff0…

windows通过cmd终止线程

1、使用 netstat 命令查看特定端口的占用情况。例如&#xff0c;要查看端口号为 8080 的情况&#xff0c;可以执行以下命令&#xff1a; netstat -ano | findstr :9009这将显示所有占用端口 9009的网络连接&#xff0c;并列出 PID&#xff08;进程标识符&#xff09;。 2、终止…

Spring Security——10,其他权限校验方法

其他权限校验方法 一、hasAnyAuthority方法二、hasRole方法三、hasAnyRole方法一键三连有没有捏~~ 前面都是使用PreAuthorize注解&#xff0c;然后在在其中使用的是hasAuthority方法进行校验。 SpringSecurity还为我们提供了其它方法例如&#xff1a;hasAnyAuthority&#xff…

Steam上线真人乙游,女性玩家还愿意买单吗?

Steam上线了一款真人乙游《糟糕&#xff01;他们太爱我了怎么办&#xff1f;》&#xff08;以下简称《糟糕&#xff01;&#xff09;。 乍一听这个游戏名&#xff0c;似乎和《完蛋&#xff01;我被美女包围了&#xff01;》有异曲同工之妙&#xff0c;事实也确实如此&#xff…

data-diff,一个超强的 Python 库!

目录 前言 安装 特性 基本功能 字典比较 列表比较 集合比较 嵌套数据结构比较 高级功能 比较忽略特定字段 自定义差异显示 数据快照比较 实际应用场景 数据监测和审计 配置管理 测试验证 总结 前言 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - data-diff …

2024使用VMware® Workstation 17 Pro部署Ubuntu22.04

官网下载镜像 https://ubuntu.com/download/server&#xff0c;配置好vmware的NAT网络。 常用设置 # root用户登录设置&#xff0c;用 sudo 也一样。 sudo passwd root vi /etc/ssh/sshd_config systemctl restart sshdVMware的网络问题 # 遇到的问题 # 1.明明显示已经连上…