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

别再重复造轮子了,几个值得应用到项目中的 Java 开源库送给你

  •  
  •   gushidefengzheng · 2020-07-27 17:37:32 +08:00 · 3732 次点击
    这是一个创建于 1610 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是风筝,公众号「古时的风筝」。文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面。公众号回复『 666 』获取高清大图。

    风筝我作为一个野路子开发者,直到遇见下面的这几个工具库,才知道之前重复造了不少轮子,而且轮子还不一定有人家的圆。相信跟我一样,没事儿造轮子的人还不在少数,有些人就是对造轮子感兴趣,这个咱也无话可说,但是,比如我,我是造轮子之前不知道这世上已经有好用的轮子了,害,无知限制了我的想象力。

    比如我们在拿到一个 List 集合之后,要对这个集合进行判空操作,以前我一直是这样写的:

    List<String> list = getList();
    if (list != null && list.size() > 0) {
        //do something
    }
    

    虽然这样也没什么问题,但是,我懒啊,每次敲这么多代码,也挺累啊。有同学说,那你包装成一个方法不就行了,每次调用个方法就 OK 啦。这不,同学,你就在造轮子了,已经有人帮你写好了这样类似的一系列方法了。

    来让我们认识认识这些轮子吧。

    Java 8 Stream

    Stream 不算是工具库,但是通过 stream 提供的一系列方法,可以实现集合的过滤、分组、集合转换等诸多操作。

    例如实现列表元素根据某个字段去重的功能。

    apache commons

    官方地址: http://commons.apache.org/

    这不是一个库,而是一系列的工具库。

    由于包含的库过多,我就不一一列举了,可以到官网一探。有集合处理的、数学计算的、IO 操作的等等,其中最常用的莫过于 Apache Commons Lang 和 Apache Commons Collections 这两个。

    Apache Commons Lang 包括一系列工具类,有字符串相关的、时间处理的、反射的、并发包的等等,Apache Commons Collections 专门用作集合处理。

    下面举几个例子说明一下,更详细的内容可以到官网查看文档。

    字符串判空操作

    String s = "";
    Boolean isEmpty = StringUtils.isEmpty(s);
    

    获取类的全名称

    ClassUtils.getName(ClassUtils.class);
    

    判断集合是否为空

    Boolean isNotEmpty = CollectionUtils.isNotEmpty(list);
    

    反射获取某个类的所有 Field

    Field[] fields = FieldUtils.getAllFields(User.class);
    

    Google Guava

    官方地址: https://github.com/google/guava

    和 Apache Commons 有点儿类似,它也是包含了一系列的比如字符串、集合、反射、数学计算等的操作封装,还可以用作 JVM 缓存。

    举几个例子说明:

    New 各种对象

    List<String> list = Lists.newArrayList();
    Set<String> set = Sets.newHashSet();
    Map<String,Object> map = Maps.newConcurrentMap();
    
    // 不可变集合
    ImmutableList<String> immutableList = ImmutableList.of("1", "2", "3");
    

    列表转符号分隔的字符串

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");
    String result = Joiner.on("-").join(list);
    
    > 1-2-3
    

    求交集、并集、差集等

    例如下面代码求 set1 和 set2 的交集

    Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5, 6);
    Set<Integer> set2 = Sets.newHashSet(1,2,3,4);
           
    Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);
    

    Joda Time

    官方地址: https://www.joda.org/joda-time/

    一个日期、时间处理的工具库。如果你不是经常做日期处理,那差不多每次需要的时候都需要查询相关的 API,而有了工具类就不一样了,只要一个 “.”,你想要的方法就出现了,而 Joda Time 就是一款好用的工具库。

    比如下面这个方法,计算到新年还有多少天。

    public Days daysToNewYear(LocalDate fromDate) {
      LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
      return Days.daysBetween(fromDate, newYear);
    }
    

    OkHttp3

    官方地址: https://square.github.io/okhttp/

    一个 HTTP 客户端,使用简单,性能良好,是时候放弃 HttpClient 了。

    一个 get 请求:

    OkHttpClient client = new OkHttpClient();
    
    String run(String url) throws IOException {
      Request request = new Request.Builder()
          .url(url)
          .build();
    
      try (Response response = client.newCall(request).execute()) {
        return response.body().string();
      }
    }
    

    一个 post 请求:

    public static final MediaType JSON
        = MediaType.get("application/json; charset=utf-8");
    
    OkHttpClient client = new OkHttpClient();
    
    String post(String url, String json) throws IOException {
      RequestBody body = RequestBody.create(json, JSON);
      Request request = new Request.Builder()
          .url(url)
          .post(body)
          .build();
      try (Response response = client.newCall(request).execute()) {
        return response.body().string();
      }
    }
    

    Json 系列

    Jackson

    Spring 默认的 Json 序列化工具,其实已经足够用了。

    Gson

    Google 出品,功能齐全。

    FastJson

    阿里出品,算法良好,性能最优。

    EasyExcel

    官方地址: https://www.yuque.com/easyexcel/doc/easyexcel

    阿里开源的 Excel 操作工具库,可以看做是 Apache POI 的增强封装版、优化版。

    如果你的数据量很大,那用 EasyExcel 可以节省内存,提升效率,并且没有并发风险。

    如果你的 Excel 足够复杂,那用 EasyExcel 会比你直接用 POI 少些很多代码。

    比如我实现了下面这个 Excel 动态导出,包括动态表头、动态合并单元格的功能,只用了很少的代码,如果是使用 POI 的话,那可能代码量增加不止一倍啊。

    excel

    TinyPinyin

    官方地址: https://github.com/promeG/TinyPinyin

    中文转拼音,把你输入的中文转换成拼音。比如搜索功能要实现这样的功能,输入 “fengzheng” 搜索,会匹配到 “风筝”这个词语,这就需要中文转拼音了。

    有的同学说了,这不是拼音转英文吗?当然不是在输入“fengzheng”的时候转换了,而是在包含“风筝”的这条记录中有一个拼音的额外字段,这样搜索的时候直接匹配拼音那个字段。

    | chinese_name | pinyin_name | | ------------ | ----------- | | 风筝 | fengzheng |

    MyBatis-Plus

    官方地址: https://mp.baomidou.com/

    只要你的项目中有数据库访问,那你肯定用过或者至少听说过 MyBatis,但是如果你只用 MyBatis 需要针对每个 DAO 方法写对应的 SQL Statement (也就是 mapper.xml 中的代码块),当然有一些自动生成的工具,MyBatis 就有它提供的 MyBatis Generator,比如我也稍做加工,做过一个web 版的 MyBatis Generator,开发效率是提高了,但是每个 mapper.xml 文件的代码量很大,于是 MyBatis-Plus 就要出场了。

    官网上对他的定义如下:

    1. 只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。
    2. 只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。
    3. 热加载、代码生成、分页、性能分析等功能一应俱全。

    最后,在配上 MybatisX IDEA 插件,也是可以了。

    vjtools

    官方地址: https://github.com/vipshop/vjtools

    这是唯品会的开源工具包,这里主要介绍其中的 vjkit 模块,是关于文本,集合,并发等基础功能的核心类库。这个库是我很早之前搜索日期操作的时候偶然发现的,我发现里面日期处理的 API 相当全面而且很实用,还在我的项目中用过一段时间。

    最后

    好用的工具库可以提高我们的开发效率,而且也是我们学习源码的好去处,和其他的开源框架(比如 Spring 、Dubbo )一样,看看优秀的代码是如何实现的。

    如果你还知道什么好用、强大的开源工具包,欢迎在留言区分享,好东西不能独享,让更多的人受益。

    我是风筝,公众号「古时的风筝」。一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!你可选择现在就关注我,或者看看历史文章再关注也不迟。

    14 条回复    2020-08-22 11:12:04 +08:00
    Comdex
        1
    Comdex  
       2020-07-27 17:54:00 +08:00 via Android
    hutool 应有尽有
    czzhengkw
        2
    czzhengkw  
       2020-07-27 17:57:47 +08:00
    @gushidefengzheng 发到推广节点去吧……
    palmers
        3
    palmers  
       2020-07-27 18:05:12 +08:00   ❤️ 7
    不要再推荐 fastjson 了
    wobuhuicode
        4
    wobuhuicode  
       2020-07-27 18:29:35 +08:00
    不重复造轮子,KPI 你来完成啊
    gushidefengzheng
        5
    gushidefengzheng  
    OP
       2020-07-27 18:46:13 +08:00
    @Comdex
    对 发完才想起这个,确实功能强大
    gz911122
        6
    gz911122  
       2020-07-27 18:55:23 +08:00
    纠正一下现在是 OkHttp4 了
    hcx0
        7
    hcx0  
       2020-07-27 19:48:15 +08:00
    FastJson 都养活多少安全团队了,EasyExcel 由于长期不更新同样存在安全漏洞。
    推广灌水公众号也不要坑别人啊。
    Kyle18Tang
        8
    Kyle18Tang  
       2020-07-27 21:47:41 +08:00
    人 Spring Boot 都去除 joda 了。
    Nich0la5
        9
    Nich0la5  
       2020-07-28 08:04:23 +08:00 via Android
    用 jackson 别用 fastjson
    xkzhangsan
        10
    xkzhangsan  
       2020-07-28 08:54:53 +08:00 via Android
    @Kyle18Tang 对的,Java8 开始推荐使用新的 Java 日期时间 api ( joda-time 里面也这样写的)。
    cco
        11
    cco  
       2020-07-28 09:12:50 +08:00
    - -都 java 8 lambda 了还 joda 呢?
    另外 lang 虽然还能用,lang3 不香么?
    json 用 Jackson 足矣,fastbug 还是算了。。。隔三差五的因为升级它而熬夜上线?
    qwerthhusn
        12
    qwerthhusn  
       2020-07-28 10:25:19 +08:00
    去看 joda 的首页,他自己都“自爆”了,jdk8 之后就别用 joda 库了,用 java 8 提供的 java.time 能力吧。

    https://sm.ms/image/QbduLkTRpZEXISh
    siweipancc
        13
    siweipancc  
       2020-08-16 14:11:27 +08:00 via iPhone
    fastbug 哈哈哈哈,笑死我了。
    每次服务器漏洞扫描都有它,习惯性升级整个项目重测了,测试人员给的期望是换成 jackson #doge
    ZeawinL
        14
    ZeawinL  
       2020-08-22 11:12:04 +08:00 via iPhone
    Bugson
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3363 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:45 · PVG 19:45 · LAX 03:45 · JFK 06:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.