大家相互分享下 Java 中常用的工具类心得 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awesomePower
V2EX    Java

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

  •  
  •   awesomePower 2023-02-24 13:58:49 +08:00 6138 次点击
    这是一个创建于 1013 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    • jdk
    // Objects // 两个对象是否相等,里面实现了 null 的判断 Objects.equals(obj1, obj2); // Function // 等同于 a -> a Function.identity(); 
    • commons-lang3
    // 整个库都非常有用,这里我举两个例子 // 单词首字母大写 StringUtils.capitalize("xx"); // 取字符串固定长度的子串(从左往右,不担心 null 和整体长度) StringUtils.left("aa", 2); // right 是从右往左 
    • commons-io
    // 关于 io 的操作,如果有相关需求,不妨去里面找找 // 下载链接到 File FileUtils.copyURLToFile(); 
    • Spring 的 util: org.springframework.util.*

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

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

    44 条回复    2023-03-07 19:48:26 +08:00
    kaf
        1
    kaf  
       2023-02-24 14:10:32 +08:00   3
    hutool
    tool2d
        2
    tool2d  
       2023-02-24 14:11:16 +08:00
    我一直琢磨着,想通过预处理源码,把 String 的字符串对比功能,从调用函数,改成==操作符重载。

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

    https://gist.github.com/Akitora-R/b15f4f1b2ad399073ae6c935bbe76f73
    luckyrayyy
        10
    luckyrayyy  
       2023-02-24 14:29:49 +08:00
    apache-commons 、guava 、hutool 太多了,这些工具类看一遍,日常的需求大部分就覆盖了。
    sss15
        11
    sss15  
       2023-02-24 14:34:32 +08:00
    hutool
    Nooooobycat
        12
    Nooooobycat  
       2023-02-24 15:16:38 +08:00   4
    一个很多人都不知道的,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
        13
    Nooooobycat  
       2023-02-24 15:17:52 +08:00
    @Nooooobycat
    ```java
    joiner := new StringJoiner(",")
    foreach item in array:
    joiner.add(item)
    joiner.toString()
    ```
    lyusantu
        14
    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
        15
    codergrowing  
       2023-02-24 15:36:02 +08:00
    @Nooooobycat #12 确实是不知道这个类的存在,一直都是用的 guava ,更方便一些,Joiner.on(",").join(iterable);
    outas
        16
    outas  
       2023-02-24 15:41:33 +08:00
    hutool 最符合国内这些 curd 的业务,其他工具类看场景,哪个方便没有坑就用哪个
    chendy
        17
    chendy  
       2023-02-24 15:42:25 +08:00
    @Nooooobycat 头一次见这个类,简单的 join 直接用 String 自己的 join 方法就可以了,需要前后缀的用这个确实方便
    28Sv0ngQfIE7Yloe
        18
    28Sv0ngQfIE7Yloe  
       2023-02-24 15:43:36 +08:00
    hutool 基本能覆盖国内 curd 的大多数场景,代码质量还算可以,作者维护比较上心,我觉得值得使用

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

    System.arraycopy
    Arrays
    String.format
    Pattern 、Matcher 正则、replace
    Files 、Paths
    initdada
        20
    initdada  
       2023-02-24 15:57:20 +08:00
    orika 、jackson
    martin2233
        21
    martin2233  
       2023-02-24 16:35:51 +08:00
    hutool
    tianmalj0613
        22
    tianmalj0613  
       2023-02-24 17:25:50 +08:00
    hutool :
    StrUtil 里面有常用字符的常量池,比如 ':' '_' '-' 等等
    BCrypt 用户密码常用加密算法实现
    IdcardUtil 中国身份证输入合法性校验,可获取年龄,性别

    暂时想到这几个吧,有些工具文档上没有,但是可能人家也包含了
    Leviathann
        23
    Leviathann  
       2023-02-24 17:38:55 +08:00
    @Nooooobycat 一般直接 stream join
    dayudayupao
        24
    dayudayupao  
       2023-02-24 17:44:51 +08:00
    hutool yyds
    alen0206
        25
    alen0206  
       2023-02-24 17:45:21 +08:00
    guava
    zoyua
        26
    zoyua  
       2023-02-24 18:08:12 +08:00
    guava
    codingbody
        27
    codingbody  
       2023-02-24 18:16:18 +08:00 via iPhone
    为啥都喜欢 hutool
    zhaorunze
        28
    zhaorunze  
       2023-02-24 18:32:31 +08:00
    apache 的时间类有 bug ,或者我调用错了,获取的时候少了八个小时
    echo1937
        29
    echo1937  
       2023-02-24 18:37:20 +08:00 via iPhone
    用 guava 比较多,apache-commons 基本不用
    wanguorui123
        30
    wanguorui123  
       2023-02-24 20:48:18 +08:00
    BeanUtil.copy
    StringUtils.isNullOrEmpty
    yao00jun
        31
    yao00jun  
       2023-02-24 21:06:58 +08:00
    guava
    cjbi
        32
    cjbi  
       2023-02-24 21:41:31 +08:00
    Jdk 没有的我一般网上搜下看有没有别人写好的能满足需求的,没有就自己手搓,能少依赖就少依赖三方库
    zhaogaz
        33
    zhaogaz  
       2023-02-24 22:00:36 +08:00
    工具有啥好分享的,遍地都是,没有再找一个呗。。。

    兴致高了 仔细看看提供的函数。。。

    不过我个人习惯是尽可能用现成的,能不写就不写,不得不写全靠抄(。
    xuanbg
        34
    xuanbg  
       2023-02-24 23:00:12 +08:00
    尽量少依赖第三方库。我是自己手撸一个,有需要增加新方法就加进去,改个版本发到私服上面。
    james2013
        35
    james2013  
       2023-02-24 23:53:34 +08:00 via Android
    hutool
    itechify
        36
    itechify  
    PRO
       2023-02-25 00:26:43 +08:00 via Android   1
    楼上没提及 vavr
    theliang
        37
    theliang  
       2023-02-25 09:54:14 +08:00
    截止目前 guava 6 票 hutool12 票,我给 hutool+1
    如果非要说具体工具类的话,
    org.apache.commons.lang3.StringUtils#isAnyBlank(CharSequence... css) # 可以传递多个字符串判断其中是否有空的
    theliang
        38
    theliang  
       2023-02-25 09:56:40 +08:00
    cn.hutool.core.text.CharSequenceUtil#isAllNotBlank 同
    @theliang
    jklove123bai
        39
    jklove123bai  
       2023-02-25 13:06:15 +08:00
    @zhaorunze 少 8 小时大约是用的 utc 时间了
    EscYezi
        40
    EscYezi  
       2023-02-25 13:58:56 +08:00 via iPhone   1
    eclipse collection
    zhaorunze
        41
    zhaorunze  
       2023-02-25 15:36:52 +08:00
    @jklove123bai 是的,没提示就很坑了,随便找的一个包,后来就长记性了,看看实现
    zhouhu
        42
    zhouhu  
       2023-02-25 17:22:49 +08:00
    eclipse collection +1
    @EscYezi
    yuekcc
        43
    yuekcc  
       2023-02-25 23:30:42 +08:00   1
    一直很好奇,为什么这么多工具库。jdk 自带的 api 就这么难用吗?
        44
    0x9527  
       2023-03-07 19:48:26 +08:00 via Android
    @tool2d Manifold 了解一下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5237 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 09:06 PVG 17:06 LAX 01:06 JFK 04:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86