大家相互分享下 Java 中常用的工具类心得

2023-02-24 13:58:49 +08:00
 awesomePower

不少开发者在开发过程中想要使用一个工具类,常常不确定该实现是否已经存在了,因此在会当场手撸一个,但有些功能其实 jdk 或者依赖的第三方库中已经有了。

这里我分享下我了解的比较好用的工具类方法:

// Objects
// 两个对象是否相等,里面实现了 null 的判断
Objects.equals(obj1, obj2);

// Function
// 等同于 a -> a
Function.identity();
// 整个库都非常有用,这里我举两个例子

// 单词首字母大写
StringUtils.capitalize("xx");

// 取字符串固定长度的子串(从左往右,不担心 null 和整体长度)
StringUtils.left("aa", 2); // right 是从右往左
// 关于 io 的操作,如果有相关需求,不妨去里面找找

// 下载链接到 File
 FileUtils.copyURLToFile();

Spring 基本上做 Web 的项目是必带的,没事可以去它的工具包里翘翘,或许可省下一些功夫。

大家有什么常用的小技巧和小心得可以相互分享下。

4720 次点击
所在节点    Java
44 条回复
kaf
2023-02-24 14:10:32 +08:00
hutool
tool2d
2023-02-24 14:11:16 +08:00
我一直琢磨着,想通过预处理源码,把 String 的字符串对比功能,从调用函数,改成==操作符重载。

又一直没动力去做这件事情,还是写太少了。
SkyLine7
2023-02-24 14:12:26 +08:00
hutool
mankismi
2023-02-24 14:19:19 +08:00
@tool2d 用 kt 就可以了 java 应该不行的。
Ayanokouji
2023-02-24 14:19:52 +08:00
@tool2d 换 kotlin
optional
2023-02-24 14:22:57 +08:00
apache 的都比较好用,但是规范规定不用 spring 的 utils
TWorldIsNButThis
2023-02-24 14:25:29 +08:00
心得就是换 kotlin
conglovely
2023-02-24 14:29:19 +08:00
hutool
Akitora
2023-02-24 14:29:46 +08:00
以前操作一些树结构的数据的时候没找到合适的工具类,自己搓了一个

https://gist.github.com/Akitora-R/b15f4f1b2ad399073ae6c935bbe76f73
luckyrayyy
2023-02-24 14:29:49 +08:00
apache-commons 、guava 、hutool 太多了,这些工具类看一遍,日常的需求大部分就覆盖了。
sss15
2023-02-24 14:34:32 +08:00
hutool
Nooooobycat
2023-02-24 15:16:38 +08:00
一个很多人都不知道的,JDK 自带的拼接字符串辅助类,java.util.StringJoiner 。它有 2 个构造函数:
1. new StringJoiner(delimiter)
2. new StringJoiner(delimiter, prefix, suffix)

那么是用来干什么的呢?
1. 做 Leetcode 等 OJ 经常碰见的需求,把一个数组输出成一行,每个元素用逗号分隔,但是结尾不能有逗号:
正例:1 ,2 ,3 ,4 ,5 反例:1 ,2 ,3 ,4 ,5 ,

joiner := new StringJoiner(",")
foreach item in array:
joiner.add(item)
joiner.toString()


2. 输出类似 Response<name: xx, age: yy, id: zz> 这样的格式,其实也相当于 1 中的用某个符号分隔一系列元素。只是有前缀后缀:
joiner := new StringJoiner(",", prefix="Response<", suffix=">")
foreach item in array:
joiner.add(item)
joiner.toString()
Nooooobycat
2023-02-24 15:17:52 +08:00
@Nooooobycat
```java
joiner := new StringJoiner(",")
foreach item in array:
joiner.add(item)
joiner.toString()
```
lyusantu
2023-02-24 15:24:56 +08:00
有一个需求要求 ID 格式为 yyyyMMdd0~100000(不足 6 位往前补 0 ,具体数字会以参数形式传递)

实现方式:return DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now()) + String.format("%06d", number)
codergrowing
2023-02-24 15:36:02 +08:00
@Nooooobycat #12 确实是不知道这个类的存在,一直都是用的 guava ,更方便一些,Joiner.on(",").join(iterable);
outas
2023-02-24 15:41:33 +08:00
hutool 最符合国内这些 curd 的业务,其他工具类看场景,哪个方便没有坑就用哪个
chendy
2023-02-24 15:42:25 +08:00
@Nooooobycat 头一次见这个类,简单的 join 直接用 String 自己的 join 方法就可以了,需要前后缀的用这个确实方便
Morii
2023-02-24 15:43:36 +08:00
hutool 基本能覆盖国内 curd 的大多数场景,代码质量还算可以,作者维护比较上心,我觉得值得使用

另外注释是中文对部分开发人员很友好
matepi
2023-02-24 15:47:15 +08:00
尽量别用,要用也只用 jdk 。尤其是各种序列化反序列化,能少用一种就少用一种,用项目 /公司里面别人已经用过的,用的多的。不然开源漏洞 fastjson 啥的真是超烦人。

System.arraycopy
Arrays
String.format
Pattern 、Matcher 正则、replace
Files 、Paths
initdada
2023-02-24 15:57:20 +08:00
orika 、jackson

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/918851

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX