V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awesomePower
V2EX  ›  Java

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

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

    不少开发者在开发过程中想要使用一个工具类,常常不确定该实现是否已经存在了,因此在会当场手撸一个,但有些功能其实 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
    oneisall8955
        36
    oneisall8955  
       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 就这么难用吗?
    0x9527
        44
    0x9527  
       2023-03-07 19:48:26 +08:00 via Android
    @tool2d Manifold 了解一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5555 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:42 · PVG 14:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.